行业资讯 2025年08月6日
0 收藏 0 点赞 891 浏览 2702 个字
摘要 :

文章目录 1.在同一时区进行比较 2.不同时区可以逐字段比较 3.比较夏令时变更期间的 ZonedDateTime 学习Java 8如何比较两个ZonedDateTime实例,包括在相同的时区和不同……




  • 1.在同一时区进行比较
  • 2.不同时区可以逐字段比较
  • 3.比较夏令时变更期间的 ZonedDateTime

学习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.zuozi.net/9625.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

986
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

463
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

347
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

455
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

515
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

831
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号