比较Java中的日期字符串
所以我使用dateString1.compareTo(dateString2)
,它根据每个字符的Unicode值对字符串进行字典比较,并返回一个int。 这是一个代码示例。
String dateString1 = "05-12-2012"; String dateString2 = "05-13-2012"; if (dateString1.compareTo(dateString2) <=0){ System.out.println("dateString1 is an earlier date than dateString2"); }
这是比较Java中日期的错误方法吗?
在我的测试中,我没有遇到过我意外结果的情况。 我真的不想从字符串中创建一个Date对象,如果我不需要,因为我在一个长时间运行的循环中这样做。
Ninja编辑从下面的答案中收集如果将日期作为字符串进行比较,如果它是yyyyMMdd
格式,但是如果它是任何其他格式,则显然会导致错误。
我实际上在我的实际代码中将日期字符串作为yyyyMMdd
格式。 (我在上面给出的示例中键入了错误的格式。)所以现在,我将保留代码,并添加几行注释以certificate我的决定。
但我现在看到比较像这样的字符串是非常有限的,如果dba决定改变日期格式,我将遇到错误,我不认为发生了。
我建议你做正确的事情( 如这里所述 )并转换为正确的Date
对象进行比较。 如果它实际上影响您的应用程序(它可能不会),请担心性能影响。
使用字符串来处理Java中的日期并不总是最佳选择。 例如,当它是闰年时 ,2月有一天。 因为字符串看似正确,所以执行转换更合适。 Javavalidation日期是否正确。
您可以使用SimpleDateFormat类将字符串转换为日期。
public static void main(String[] args) throws ParseException { String dateString1 = "05-12-2012"; String dateString2 = "05-13-2012"; SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy"); Date date1 = format.parse(dateString1); Date date2 = format.parse(dateString2); if (date1.compareTo(date2) <= 0) { System.out.println("dateString1 is an earlier date than dateString2"); } }
要找出允许哪些参数检查自定义格式(Java™教程>国际化>格式化)
这是非常糟糕的,因为现在你无法处理一年的变化。
如果你想这样你可能想把日期格式化为YYYY-MM-DD
所以新的一年不会破坏它。
使用字母顺序规则来处理日期排序是很糟糕的,主要是因为你遇到根据字母和数字系统对事物进行不同排序的问题
对于字母表
01-02-2011 comes before 01-1-2011 (because 0 in the date field is before 1 in the other date field)
对于数字系统
01, 02, 2011 comes after 01, 1, 2011 because all fields are being compared like numbers
日期对象扩展数字比较以了解哪些字段在比较中优先,因此您不会在较早的月份之前将日期“放在”另一个实际发生在后一个月但是较早年份的日期之前。
如果您严格控制日期格式,则可以将日期对齐,以便它们也遵循字母规则; 但是,如果您不小心注入了错误格式的日期,那么这样做可能会导致您的整个程序以奇怪的方式失败。
执行此操作的典型方法是(不推荐,请使用非字符串日期比较)
YYYYMMDD (year)(month)(day) all zero-padded.
最后一种技术主要包括在内,因为你最终会在野外看到它,并且应该认识它是什么:尝试处理没有正确日期库的日期(也就是一个聪明的黑客)。
如果您只对每个日期进行一次读取,则YYYYMMDD(不是MMDDYYYY)可能是最佳解决方案。 但是当你打算不止一次处理每个日期时(例如你正在对它们进行排序)那么肯定最好将它们更改为可以比字符串更快比较的对象(例如日期)
如上所述,通常更好地使用日期时间对象而不是字符串。
java.time
其他答案使用旧的过时的日期时间类,这些类已被certificate设计糟糕,令人困惑且麻烦。 他们缺少一个真正代表仅限日期的值的类,没有时间和没有时区。
而是使用Java 8及更高版本中内置的java.time框架。 请参阅Oracle教程 。 大部分java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7,并进一步适应了ThreeTenABP中的 Android。
String input = "05-12-2012"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MM-dd-yyyy" ); LocalDate ld = LocalDate.parse( input , formatter );
LocalDate
实现了compareTo
。 此外,您可以调用方法equals,isBefore,isAfter。
Boolean isEarlier = ld.isBefore( someOtherLocalDate );