Java日期比较:不同格式的日期

时间:2018-08-30 00:26:47

标签: java date iso8601 date-comparison java.time.instant

我有两个日期以String格式表示:\chapter*String date1 = 2018-08-29格式为ISO-OFFSET_DATE_TIME。比较date1和date2是否相等的最佳方法是什么?我不关心时间,只关心日,年和月。我应该将它们转换为即时并进行比较吗?

3 个答案:

答案 0 :(得分:3)

最快的方法是;

String date1 = "2018-08-29";
String date2 = "2018-08-30T00:00:00+10:00";
boolean isEqual = date2.startsWith(date1);

答案 1 :(得分:2)

tl; dr

LocalDate
.parse( "2018-08-29" ) 
.isEqual(
    OffsetDateTime
    .parse( "2018-08-30T00:00:00+10:00" )
    .toLocalDate()
)
  

false

java.time

java.time 中以适当的类型解析每个输入。

LocalDate ld = LocalDate.parse( "2018-08-29" ) ;
OffsetDateTime odt = OffsetDateTime.parse( "2018-08-30T00:00:00+10:00" ) ;

通过从LocalDate中提取OffsetDateTime进行比较。

Boolean sameDate = ld.isEqual( odt.toLocalDate() ) ;
  

false

或者您可能想将OffsetDateTime从UTC之前十小时的偏移量调整为另一个偏移量或时区。例如,让我们在提取要比较的日期之前将其调整回UTC。

LocalDate
.parse( "2018-08-29" ) 
.isEqual(
    OffsetDateTime
    .parse( "2018-08-30T00:00:00+10:00" )
    .withOffsetSameInstant( ZoneOffset.UTC )
    .toLocalDate()
)

这会将我们的结果从上面的代码中看到的false更改为true

  

true

答案 2 :(得分:0)

如果这是您唯一想了解的两个字符串,则:

    LocalDate ld1 = LocalDate.parse(date1);
    LocalDate ld2 = LocalDate.parse(date2, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    if (ld1.isEqual(ld2)) {
        System.out.println("They are the same date");
    } else {
        System.out.println("They are different dates");
    }

使用字符串示例输出以下问题:

  

他们是不同的日期

当他的答案出现时,我只是在写类似于that by Basil Bourque的代码。我更喜欢用正确的日期时间对象来处理日期和时间,这正是他在做什么。通过将date2解析为OffsetDateTime,您可以保留所有信息,并且可以轻松地转换为LocalDate进行比较。对于大多数目的,我建议采用这种方式。

仅当您确定自己永远不需要一天的时间时,才可以使用快捷方式。您当然可以使用the fast way by JunJie Wang。不过,我更喜欢上面的代码,这有两个原因:我清楚地告诉读者,字符串是日期和时间,因此可以正确地处理它们。因此,它还提供了字符串格式的验证。如果有一天不小心收到了完全不同的字符串,则会通过DateTimeParseException通知您。