我无法理解为ZonedDateTimeClass中的plusDays()方法提供的文档的一个特定部分。文档指出:
返回此ZonedDateTime的副本,其中添加了指定的天数。
这在本地时间线上操作,将天添加到本地日期时间。然后将其转换回ZonedDateTime,使用区域ID获取偏移量。
当转换回ZonedDateTime时,如果本地日期-时间重叠,则可能保留偏移量,否则将使用较早的偏移量。如果在间隙中,则本地日期-时间将向前调整差距的长度。
此示例是不可变的,不受此方法调用的影响。
参数:days -要添加的天数,可以是负数
返回:基于此日期时间加上天数的ZonedDateTime,不能为null
抛出:DateTimeException -如果结果超出支持的日期范围
我是如何理解的:假设我们有一个表示September 4, 2022 6 PM in America/New_York TimeZone
的ZonedDateTime对象。所以这个方法首先会将它转换为LocalDateTime,也就是说,它会丢失时区信息,只保留September 4, 2022 6 PM
。它会向它添加一些天数,比如说7天,这样结果就是September 11, 2022 6 PM
,现在它会通过提供与时区相关的信息将它转换回ZonedDateTime对象。
但是后面的文档我看不懂,就是,
当转换回ZonedDateTime时,如果本地日期-时间重叠,则可能保留偏移量,否则将使用较早的偏移量。如果在间隙中,则本地日期-时间将向前调整差距的长度。local date-time is in an overlap
是什么意思?...then the offset will be retained if possible, otherwise the earlier offset will be used.
-这两个不同的偏移量是什么?If in a gap...
-这个间隙是什么?
2条答案
按热度按时间bttbmeg01#
“gap”和“overlap”术语在
ZonedDateTime
类的类级别Javadoc中定义:这个类处理从本地时间线
LocalDateTime
到即时时间线Instant
的转换。两个时间线之间的差异是从UTC/Greenwich
的偏移,由ZoneOffset
表示。在两个时间线之间进行转换涉及使用从ZoneId访问的规则计算偏移量。获取某个时刻的偏移量很简单,因为每个时刻只有一个有效偏移量。相比之下,获取本地日期时间的偏移量并不简单。有三种情况:
示例
让我们使用
America/New_York
时区的具体示例。根据timeanddate.com,2022年纽约的夏令时变化如下:2022年3月13日-夏令时开始
当当地标准时间即将到达
2022年3月13日(星期日)上午2:00:00时钟向前调整1小时至
2022年3月13日星期日,当地夏令时间3:00:00**am。
2022年11月6日-夏令时结束
当当地夏令时即将到达
2022年11月6日,星期日,2:00:00上午时钟向后调整1小时至
2022年11月6日(星期日)当地标准时间1:00:00**am。
因此,3月13日在纽约时区没有2:00到2:59之间的时间。1:59发生在标准时间。当该分钟结束时,没有2:00小时发生,而是当地时间跳到3:00日光时间。
此外,1:00至1:59之间的时间在11月6日出现两次:一个在日光时间,然后一个在标准时间。
Java
ZonedDateTime
示例由于3月12日凌晨2:15不存在,并且在1小时的间隔内,因此您引用的以下逻辑适用,将当地时间增加1小时:
如果在间隙中,本地日期时间将根据差距的长度向前调整。
因此,在3月11日1:15 AM添加1天时,使用3:15 AM。
由于1:15 AM是在重叠期间- 1:15 AM在11月6日出现两次-您引用的以下逻辑适用,使用与11月5日1:15 AM相同的-04:00区域偏移:
如果本地日期-时间重叠,则可能的话将保留偏移量
因此,在11月5日的1:15添加1天将使用11月6日的第一个1:15。第二次调用使这一点更加明显,它显示在此时间戳上添加一个小时将返回11月6日的第二个1:15。尽管这两个时间点都是当地时间1:15,但它们是时间轴上的不同点,这一事实通过它们不同的区域偏移量可以看出:-04:00和-05:00。
mefy6pfw2#
政治时间呈现异常
ZonedDateTime
是 * 政治 * 时间。政治家定义时区并制定规则。令人惊讶的是,世界各地的政客们都表现出了对这些规则的普遍偏好,而且他们的行为出人意料,通常很少或根本没有警告。
政客们可以决定每个人都应该在早上早起一个小时,然后在半年内改变他们的决定,强制人们晚一个小时开门-这个古怪的计划被称为Daylight Saving Time (DST)。
最新时尚:政客们决定他们管辖范围内的人应该全年都呆在夏令时。所以太阳在中午永远不会在头顶上,违背了“中午”的定义。
军事胜利者、殖民者和占领者可能会选择一个适合自己祖国的时区。
政治家可能会改变其管辖权的抵消,以惹恼他们的邻居(S),或安抚他们的邻居(S),作为一种外交行动。
Spring forward;撤退
在任何这些异常期间,时钟的指针必须向前或向后跳跃一定的时间,一定的小时-分钟-秒。
例如,美国许多观测夏令时的地方一年更改两次时钟。在 Spring 的某一天,它们在凌晨2点跳前一个小时。因此,使用的偏移量更改一个小时,例如
America/Los_Angeles
从偏移量-08:00更改为-07:00。这些地方随后在秋季的某一天的凌晨2点回落一个小时。使用的偏移量更改一个小时,例如America/Los_Angeles
从偏移量-07:00更改为-08:00。在第一种情况下,当向前跳跃时,我们跳过了一个小时。所以一天更短,只有23个小时长。👉这个跳过的小时就是Javadoc中的“差距”。
在第二种情况下,当时钟福尔斯一个小时时,如何识别一天中的时间(如01:30)存在歧义。“01:30”是指第一个小时的中间还是第二个小时的中间?👉这个重复的小时及其歧义是Javadoc中“重叠”所指的。
我认为理性的人可能会对如何最好地解决这种歧义产生分歧。java.time 类,特别是
ZonedDateTime
,有其解决歧义的算法。理解其选择的方案是至关重要的,这样您就知道如何使用它。The Javadoc确实涵盖了这一点。引用如下:
有三种情况:
*正常,有一个有效的偏移量。对于一年中的大多数时间,正常情况适用,其中本地日期时间有一个有效的偏移量。
*Gap,有效偏移为零。这是由于 Spring 夏令时从“冬季”变为“夏季”而导致时钟向前跳的情况。在间隙中,存在没有有效偏移的本地日期时间值。
*重叠,具有两个有效偏移。这是由于秋季夏令时从“夏季”变为“冬季”而导致时钟回拨的典型情况。在重叠中,存在具有两个有效偏移的本地日期时间值。
作为定义的提醒: