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 的偏移量(无时区信息)
- 应该用于在数据库中存储日期或通过网络进行通信