Java如何比较两个ZonedDateTime时间大小

后端 潘老师 6个月前 (10-31) 184 ℃ (0) 扫码查看

学习Java 8如何比较两个ZonedDateTime实例,包括在相同的时区和不同的时区。

1.在同一时区进行比较

我们知道ZonedDateTime实例是具有偏移量的全局时间线上的一个点。因此,要比较两个这样的实例,从逻辑上讲,两个实例应该在相同的时区,然后比较日期和时间值。

当我们使用以下方法比较两个ZonedDateTime实例时,情况就是这样。

  • isAfter()
  • isBefore()
  • isEqual()

zdt1.isAfter(zdt2)比较两个日期时间值的瞬间,类似于zdt1.toInstant().equals(zdt2.toInstant())。

这些方法不使用逐字段比较,而是比较两个实例的epoch秒。

ZonedDateTime zdtNow = ZonedDateTime.now();
System.out.println("Time in IST" + zdtNow);
ZonedDateTime zdtNowinUTC = zdtNow.withZoneSameInstant(ZoneId.of("UTC"));
System.out.println("Time in UTC" + zdtNowinUTC);
if(zdtNow.toEpochSecond() == zdtNowinUTC.toEpochSecond()) { //true
  System.out.println("Epoch Seconds are equal");
}
System.out.println(zdtNow.isEqual(zdtNowinUTC));    //true
System.out.println(zdtNow.isBefore(zdtNowinUTC));   //false
System.out.println(zdtNow.isAfter(zdtNowinUTC));    //false

输出:

2022-02-16T00:17:34.656584400+05:30[Asia/Calcutta]
2022-02-15T18:47:34.656584400Z[UTC]
Epoch Seconds are equal
true
false
false

2.不同时区可以逐字段比较

如果我们有两个ZonedDateTime实例,我们想进行逐字段比较,那么我们可以使用以下方法:

  • compareTo()
  • equals()

这两种方法都会比较实例,包括年份。比较首先基于时间戳,然后基于本地日期时间,然后基于时区ID,然后基于年份。因此,compareTo()比较两个实例中的所有4个信息。
如果返回值小于零,则表示第一个实例小于第二个实例;如果返回值大于零,则表示第一个实例大于第二个实例;如果返回值为零,则表示两个日期时间实例相等。

ZonedDateTime zdtNow = ZonedDateTime.now();
System.out.println("Time in IST" + zdtNow);

ZonedDateTime zdtNowinUTC = zdtNow.withZoneSameInstant(ZoneId.of("UTC"));
System.out.println("Time in UTC" + zdtNowinUTC);

System.out.println(zdtNow.compareTo(zdtNowinUTC));  //1
System.out.println(zdtNow.equals(zdtNowinUTC));  // fasle

3.比较夏令时变更期间的 ZonedDateTime

我们应该记住,ZonedDateTime 是带有时区 ID 和偏移量信息的日期时间值,采用 ISO-8601 日历系统。请注意,时区 ID 在一年中可以有不同的偏移量,主要是在夏令时(日光节约时间)变更期间,当偏移量增加或减少1小时时。

对于大多数不使用夏令时的时区,以及在受夏令时影响的时区中没有重叠或没有间隔时间,isEqual()、isBefore() 或 isAfter() 方法会给出一致和可预测的结果。

我们唯一关心的是重叠期间(当时钟向前跳)和间隔期间(当时钟向后设定)。

  • 对于间隔,一般的策略是将实例移至稍后的偏移量。
  • 对于重叠,如果可用,将保留前一个偏移量。如果前一个偏移量不可用或无效,提供了两个额外的方法 withEarlierOffsetAtOverlap() 和 withLaterOffsetAtOverlap()。

在给定的示例中,给出了两个实例。一个实例处于重叠期间,另一个实例在重叠期间之后。请注意前两个打印语句中打印的偏移量值。

在重叠期间,保留了前一个偏移量(-05:00)。我们使用 withLaterOffsetAtOverlap() 方法来使用最晚的偏移量值,即 -06:00。

ZonedDateTime zonedDTDuringOverlap = ZonedDateTime
  .of(LocalDateTime.of(2021, 11, 07, 1, 05, 53), ZoneId.of("US/Central"));
ZonedDateTime zonedDTAfterOverlap = ZonedDateTime
  .of(LocalDateTime.of(2021, 11, 07, 2, 05, 53), ZoneId.of("US/Central"));
System.out.println("During overlap: " + zonedDTDuringOverlap);
System.out.println("After overlap(): " + zonedDTAfterOverlap);
ZonedDateTime zonedDT = zonedDTDuringOverlap.withLaterOffsetAtOverlap();
System.out.println("Using withLaterOffsetAtOverlap(): " + zonedDT);

程序输出:

During overlap: 2021-11-07T01:05:53-05:00[US/Central]
After overlap(): 2021-11-07T02:05:53-06:00[US/Central]
Using withLaterOffsetAtOverlap(): 2021-11-07T01:05:53-06:00[US/Central]

以上就是Java如何比较两个ZonedDateTime时间大小的方法。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10524.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】