比较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 );