了解Java中的*ZonedDateTime*和OffsetDateTime类,并深入了解这两个类的主要区别是什么。
目录
1.理解区域标识和区域偏移
在跳到类的内部结构之前,让我们确保理解区域标识符和区域偏移之间的区别。
大多数编程语言从一个特定的时间点(称为纪元)开始测量时间。例如,Java Date表示自1970年1月1日00:00(午夜)起的毫秒数 的long ,在UTC(或 GMT)。
这样的值是与时区无关的,因为在任何给定的时刻,在地球上任何地方的UTC都是相同的。但这个时间值可以转化为任何特定的时区偏移,用于显示和处理。
- 时区偏移是一个特定时区和UTC之间的小时和分钟的差异。例如,值-08:00代表一个时区比UTC晚8小时的特定时间。
- 区域标识符(时区)是一个特定地点或地区的标识符,它可转化为计算区域偏移的规则组合。一个时区在一年中可以有一个以上的偏移量与之挂钩。
例如,太平洋时间与UTC没有固定的偏移量;相反,在一年中,当夏令时(DST)开启或关闭时,偏移量会改变。
因此,自纪元以来的UTC时间在任何给定的时间点和世界的一部分总是相同的。但当我们应用启用夏令时的时区规则时,那么这个瞬间就不是一个固定的数字,它在该时区一年中的某段时间内会移动。
例如,假设我们在夏令时结束时将时钟从凌晨2点向后移动一小时到凌晨1点。在这种情况下,凌晨1:30会出现两次,造成歧义。OffsetDateTime ,但ZonedDateTime ,没有考虑到这种情况。
2.2.OffsetDateTime
OffsetDateTime 是一个不可改变的日期时间值的表示,精度为纳秒,与ISO-8601日历系统中的UTC/格林威治有一个偏移。因为它取决于偏移量,而不是时区,所以偏移量值不会随着动态时区规则而改变。
OffsetDateTime 的一个实例总是代表时间线上的一个独特的瞬间,因此它非常适用于我们想拥有独立于时区的时间戳的情况。例如,我们可以使用OffsetDateTime ,将时间戳存储在数据库中,或通过网络发送XML文档中的时间戳值。
OffsetDateTime 类结合了 LocalDateTime类和ZoneOffet类。下面给出的是一个Java程序,用来获取当前的UTC时间并存储在数据库中。
OffsetDateTime now = OffsetDateTime.now(ZoneOffset.of("UTC"));
3.ZonedDateTime
与OffsetDateTime类似,该类也表示ISO-8601日历系统中带有时区的日期时间。不同的是,ZonedDateTime 遵循DST规则的变化,可以根据一年中的时间(夏季/冬季)有不同的偏移。
ZonedDateTime类,实际上是将LocalDateTime类和ZoneId类结合起来。下面是一个Java程序,用来获取在*"美国/洛杉矶 "*时区的地点,通过当前有效的区域偏移来调整的当前时间戳。
ZonedDateTime now
= ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));
4.总结
如果我们用一句话来总结整个讨论,那么ZonedDateTime是完全了解夏令时的,并尊重夏令时的调整,而OffsetDateTime表示从GMT/UTC(没有时区信息)调整的偏移量。
使用OffsetDateTime在通用时间线中存储唯一的时刻,而不考虑时区,例如在数据库中保留时间戳或将信息传输到世界各地的远程系统。
使用ZonedDateTime,根据用户的当地时区规则和偏移量向他们显示时间戳。
学习愉快!!
这个帖子有帮助吗?
如果你喜欢这篇文章,请告诉我们。这是我们能够改进的唯一方法。
有
没有