2012-05-15 129 views
7

因此,我使用的是dateString1.compareTo(dateString2),它基于每个字符的Unicode值对字符串进行字典式比较,并返回一个int值。这是一个代码示例。在Java中比较日期字符串

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对象,因为我在长时间运行的循环中执行此操作。

忍者编辑 从答案拾荒下面有什么不对比较日期为一个字符串,如果它是在yyyyMMdd格式,但如果是在任何其他格式会明显导致错误。

我实际上在我的实际代码中实际上有我的日期字符串为yyyyMMdd格式。 (我在上面给出的示例中输入了错误的格式。)因此,现在我只是保留原来的代码,并添加几行注释来证明我的决定。

但我现在看到,比较这样的字符串是非常有限的,如果dba决定将日期格式更改为道路,我将不会看到发生的情况。

+2

看看这个问题由我问前段时间http://stackoverflow.com/questions/2592501/compare-dates-in-java – ant

回答

8

我建议你做正确的事(as described here)并转换为适当的Date对象进行比较。担心如果实际影响您的应用程序时性能会受到影响(它可能不会)。

+2

除了在2017年(和之后),改为“LocalDate”,而不是(“Date”在2012年是不错的选择,现在已经过时了)。 –

4

这是非常糟糕的,因为现在你不能处理一年的变化。

如果你想这样做,你可能想格式化日期为YYYY-MM-DD,所以新的一年不会毁了它。

+1

任何建议比较日期为字符串的方法值得一对夫妇友好的拳击! :) – Alfabravo

+3

YYYYMMDD可以比较为字符串。 –

17

使用字符串来处理Java中的日期并不总是最好的选择。例如,当它是跳跃年,2月有一个额外的一天。由于字符串可能看似正确,因此执行转换更合适。 Java验证日期是否正确。

可以使用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"); 
    } 
} 

要了解哪些参数允许检查Customizing Formats (The Java™ Tutorials > Internationalization > Formatting)

+0

你试过这段代码吗? –

+0

是的,打印'dateString1是比dateString2'更早的日期。代码有问题吗? –

+0

日期字符串的格式不同于SimpleDateFormat构造函数。 –

1

如果你正在做各只有一个日期,然后YYYYMMDD(不MMDDYYYY因为你做到了)的读取可能是最优化的解决方案。然而,当你打算每次处理多个日期(例如,你正在对它们进行排序)时,最好将它们改为一个比字符串更快的对象(例如,日期)

2

这是不好用的规则,字母化处理的日期顺序,主要是因为你碰到那里的东西是有序的不同根据字母和数字系统

字母表

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 

日期对象扩展数字比较知道哪些字段优先在试比较n,所以你不会在前一个月的某个日期之前“在”另一个实际发生在另一个月但是较早的一个月。

如果你对日期格式有严格的控制,你可以对齐日期,使它们也遵循字母规则;但是,如果您不小心插入了格式不正确的日期,那么这样做可能会导致整个程序以奇怪的方式失败。

做到这一点的典型方式(不推荐,请使用非字符串日期比较)

YYYYMMDD 
(year)(month)(day) all zero-padded. 

最后的技术被列入主要是因为你最终会看到它在野外的,应该承认它它是什么:尝试处理日期没有适当的日期库(又名聪明的黑客)。

+0

谢谢。你能给最后一部分提供参考吗?这种情况对我很有帮助,但我只想确保逻辑充分证明 – ShikharDua

1

如前所述,通常更适合使用日期 - 时间对象而不是字符串。

java.time

其他答案使用已被证明是设计不当,令人费解,麻烦老过时的日期时间类。他们缺乏一门课来真正代表没有时间和没有时区的日期价值。

改为使用内置于Java 8及更高版本中的java.time框架。见Oracle Tutorial。许多java.time功能被移植到ThreeTen-Backport中的Java中,并进一步适用于Android的ThreeTenABP

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