比较Java中的日期字符串

时间:2012-05-15 22:18:17

标签: java date

所以我使用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 Edit 从下面的答案中收集,将日期作为字符串进行比较是没有错的,如果它是yyyyMMdd格式,但如果它是任何其他格式,则显然会导致错误。

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

但我现在看到比较像这样的字符串是非常有限的,如果dba决定改变日期格式,我会遇到错误,我认为没有发生。

6 个答案:

答案 0 :(得分: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)

答案 1 :(得分:8)

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

答案 2 :(得分:4)

现在非常糟糕,因为现在你无法处理一年的变化。

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

答案 3 :(得分:3)

使用字母顺序规则来处理日期排序是很糟糕的,主要是因为你遇到根据字母和数字系统对事物进行不同排序的问题

字母

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.

最后一种技术主要包括在内,因为你最终会在野外看到它,应该认识它是什么:尝试处理没有正确日期库的日期(也就是一个聪明的黑客)。

答案 4 :(得分:2)

如上所述,通常使用日期时间对象而不是字符串更好。

java.time

其他答案使用旧的过时的日期时间类,这些类已被证明设计糟糕,令人困惑且麻烦。他们缺少一个真正代表仅限日期的值的类,没有时间和没有时区。

而是使用Java 8及更高版本中内置的java.time框架。见Oracle Tutorial。许多java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的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 );

答案 5 :(得分:1)

如果您只对每个日期进行一次读取,则YYYYMMDD(不是MMDDYYYY)可能是最佳解决方案。但是,如果您打算多次处理每个日期(例如,您正在对它们进行排序),那么确定最好将它们更改为可以比字符串更快比较的对象(例如日期)