【问题标题】:Java Date comparison: Dates in different formatsJava 日期比较:不同格式的日期
【发布时间】:2018-08-30 00:26:46
【问题描述】:

我有两个字符串格式的日期:String date1 = 2018-08-29 和ISO-OFFSET_DATE_TIME 格式的String date2 = 2018-08-30T00:00:00+10:00。比较 date1 和 date2 是否相等的最佳方法是什么?我不关心时间,只关心日、年和月。我应该将它们转换为即时并进行比较吗?

【问题讨论】:

  • LocalDate.parse(date1).equals(OffsetDateTime.parse(date2).toLocalDate())
  • 那将是最简单的方法。如果您不确定输入,您可能需要考虑与这两种格式不同的任何格式。如果 date1 和 date2 始终采用所描述的格式,那么您应该很高兴。如果你想让我为你写出来,我很乐意。
  • date1 是 LocalDate,date2 是 OFFSET_DATE_TIME,请问预期的输出是什么?
  • @OleV.V.我不确定 OP 在比较之前是否需要更改 OFFSET。
  • 这是一个很好很有趣的问题,@Sun,因为它在所有时区都不是同一个日期。

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


【解决方案1】:

tl;博士

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

假

java.time

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

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

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

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

假

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

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

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

是的

【讨论】:

    【解决方案2】:

    最快的方法是;

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

    【讨论】:

      【解决方案3】:

      如果这是你唯一想知道的关于这两个字符串的事情:

          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 收到通知。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-17
        • 2020-10-01
        • 2019-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-01
        • 1970-01-01
        相关资源
        最近更新 更多