章
目
录
学习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时间大小的方法。