Java 中的ZonedDateTime 和 OffsetDateTime

ZonedDateTime 和 OffsetDateTime是 Java 8 DateTime API 中新加入的时间类。两者都在时间线上存储了一个精确到纳秒的瞬时态。而且在它们之间进行选择可能会让人感到困惑。

ZonedDateTime

ZonedDateTime 是 ISO-8601 日历系统中具有时区的日期时间的不可变表示,例如 2022-04-03T10:15:30+01:00 Europe/Paris。它拥有相当于三个独立对象的状态:LocalDateTime、ZoneId和ZoneOffset。

在这里,ZoneId确定偏移量的变化方式和时间。因此,偏移量不能自由设置。

要获取特定区域的当前 ZonedDateTime ,我们将使用:

ZoneId zone = ZoneId.of("Asia/Shanghai");
ZonedDateTime zonedDateTime = ZonedDateTime.now(zone);

ZonedDateTime 类还提供了将给定日期从一个时区转换为另一个时区的方法:

ZonedDateTime destZonedDateTime = sourceZonedDateTime.withZoneSameInstant(destZoneId);

此外,它完全支持 DST 并能够处理夏令时。

OffsetDateTime

OffsetDateTime是日期时间的不可变表示,在 ISO-8601 日历系统中具有与 UTC/格林威治的偏移量,例如 2022-02-04T10:15:30+01:00。换句话说,它存储 所有日期和时间字段,精度为纳秒,以及与 GMT/UTC 的偏移量。

从 GMT/UTC 偏移两小时来获取当前的 OffsetDateTime:

ZoneOffset zoneOffSet= ZoneOffset.of("+02:00");
OffsetDateTime offsetDateTime = OffsetDateTime.now(zoneOffSet);

两者区别

ZonedDateTime

  • 存储所有日期和时间字段,精度为纳秒,以及时区,时区偏移,用于处理不明确的本地日期时间
  • 不能自由设置偏移,因为时区控制偏移值
  • 支持夏令时 DST 并能调整夏令时
  • 在用户特定的时区显示日期时间字段时派上用场

OffsetDateTime

  • 存储所有日期和时间字段,精度为纳秒,以及与 GMT/UTC 的偏移量(无时区信息)
  • 应该用于在数据库中存储日期或通过网络进行通信
转载请注明出处:码谱记录 » Java 中的ZonedDateTime 和 OffsetDateTime
标签: