了解ZonedDateTime::plusDays的javadoc

w7t8yxp5  于 2023-04-04  发布在  Java
关注(0)|答案(2)|浏览(105)

我无法理解为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...-这个间隙是什么?

bttbmeg0

bttbmeg01#

“gap”和“overlap”术语在ZonedDateTime类的类级别Javadoc中定义:
这个类处理从本地时间线LocalDateTime到即时时间线Instant的转换。两个时间线之间的差异是从UTC/Greenwich的偏移,由ZoneOffset表示。
在两个时间线之间进行转换涉及使用从ZoneId访问的规则计算偏移量。获取某个时刻的偏移量很简单,因为每个时刻只有一个有效偏移量。相比之下,获取本地日期时间的偏移量并不简单。有三种情况:

  • 正常,有一个有效的偏移量。对于一年中的绝大多数时间,适用正常情况,其中本地日期-时间有一个有效的偏移量。
  • 间隙,具有零有效偏移。这通常是由于 Spring 夏令时从“冬季”变为“夏季”而导致时钟向前跳的情况。在间隙中,存在没有有效偏移的本地日期时间值。
  • 重叠,具有两个有效偏移。这是由于秋季夏令时从“夏季”变为“冬季”而导致时钟回拨的情况。在重叠中,存在具有两个有效偏移的本地日期-时间值。

示例

让我们使用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示例

ZoneId zone = ZoneId.of("America/New_York");

// 2022-03-13T03:15:30-04:00[America/New_York] (no 2:15)
System.out.println(
        ZonedDateTime.of(LocalDateTime.parse("2022-03-12T02:15:30"), zone)
        .plusDays(1));

由于3月12日凌晨2:15不存在,并且在1小时的间隔内,因此您引用的以下逻辑适用,将当地时间增加1小时:
如果在间隙中,本地日期时间将根据差距的长度向前调整。
因此,在3月11日1:15 AM添加1天时,使用3:15 AM。

ZoneId zone = ZoneId.of("America/New_York");

// 2022-11-06T01:15:30-04:00[America/New_York] (First 1:15)
System.out.println(
        ZonedDateTime.of(LocalDateTime.parse("2022-11-05T01:15:30"), zone)
        .plusDays(1));

// 2022-11-06T01:15:30-05:00[America/New_York] (Second 1:15)
System.out.println(
        ZonedDateTime.of(LocalDateTime.parse("2022-11-05T01:15:30"), zone)
        .plusDays(1).plusHours(1));

由于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。

mefy6pfw

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。

  • 在第一种情况下,时钟向前跳,02:00 - 03:00的时间永远不存在,一天23小时。
  • 在第二种情况下,时钟倒回,01:00 - 02:00的时间发生 * 两次*,一天25小时。

在第一种情况下,当向前跳跃时,我们跳过了一个小时。所以一天更短,只有23个小时长。👉这个跳过的小时就是Javadoc中的“差距”。
在第二种情况下,当时钟福尔斯一个小时时,如何识别一天中的时间(如01:30)存在歧义。“01:30”是指第一个小时的中间还是第二个小时的中间?👉这个重复的小时及其歧义是Javadoc中“重叠”所指的。
我认为理性的人可能会对如何最好地解决这种歧义产生分歧。java.time 类,特别是ZonedDateTime,有其解决歧义的算法。理解其选择的方案是至关重要的,这样您就知道如何使用它。
The Javadoc确实涵盖了这一点。引用如下:
有三种情况:

*正常,有一个有效的偏移量。对于一年中的大多数时间,正常情况适用,其中本地日期时间有一个有效的偏移量。
*Gap,有效偏移为零。这是由于 Spring 夏令时从“冬季”变为“夏季”而导致时钟向前跳的情况。在间隙中,存在没有有效偏移的本地日期时间值。
*重叠,具有两个有效偏移。这是由于秋季夏令时从“夏季”变为“冬季”而导致时钟回拨的典型情况。在重叠中,存在具有两个有效偏移的本地日期时间值。

作为定义的提醒:

    • 偏移量 * 仅指UTC(或GMT)的时间本初子午线之前或之后的小时-分钟-秒数。
    • 时区 * 意味着更多.一个时区是一个命名的历史的过去,现在,和未来的变化所使用的偏移量由一个特定地区的人民所决定的他们的政治家.

相关问题