gpt4 book ai didi

Java ZonedDateTime 和英国夏令时间

转载 作者:行者123 更新时间:2023-12-01 06:04:14 26 4
gpt4 key购买 nike

我目前正在研究日期在英国夏令时间之内和之外时的 ZonedDateTime 行为。

英国夏令时间从 3 月 25 日开始,增加一小时 (+1)。

我创建了几个 ZonedDateTime 实例(UTC 和欧洲/伦敦),接下来我向它们添加了 1 个月,以便它们落入 ZonedDateTime。

// These dates will be outside British Summer Time
ZonedDateTime utcFirstMarch = ZonedDateTime.of(2018, 3, 1, 12, 0, 0, 0, ZoneId.of("UTC"));
ZonedDateTime londonFirstMarch = ZonedDateTime.of(2018, 3, 1, 12, 0, 0, 0, ZoneId.systemDefault());

// These dates will be inside British Summer Time
ZonedDateTime utcFirstMarchPlusMonth = ZonedDateTime.of(2018, 3, 1, 12, 0, 0, 0, ZoneId.of("UTC")).plusMonths(1);
ZonedDateTime londonFirstMarchPlusMonth = ZonedDateTime.of(2018, 3, 1, 12, 0, 0, 0, ZoneId.systemDefault()).plusMonths(1);

ZonedDateTime londonFirstMarchPlusMonthToUtc = ZonedDateTime.of(2018, 3, 1, 12, 0, 0, 0, ZoneId.systemDefault()).plusMonths(1).withZoneSameInstant(ZoneId.of("UTC"));

这是我打印这些日期时的结果:

utcFirstMarch:                  2018-03-01T12:00Z[UTC]
londonFirstMarch: 2018-03-01T12:00Z[Europe/London]
utcFirstMarchPlusMonth: 2018-04-01T12:00Z[UTC]
londonFirstMarchPlusMonth: 2018-04-01T12:00+01:00[Europe/London]
londonFirstMarchPlusMonthToUtc: 2018-04-01T11:00Z[UTC]

最后我打印出了每个日期的纪元秒:

utcFirstMarch:                  1519905600
londonFirstMarch: 1519905600
utcFirstMarchPlusMonth: 1522584000
londonFirstMarchPlusMonth: 1522580400
londonFirstMarchPlusMonthToUtc: 1522580400

我知道 ZonedDateTime 是不可变的。这意味着当我添加一个月时,我实际上创建了一个更改了月份的新实例。您能否告诉我我对给定观察结果的假设是否正确:

  1. 添加一个月将创建一个新的 ZonedDateTime 实例。 ZonedDateTime 上的小时将始终相同。新日期是否为 BST 并不重要。 (查看 LondonFirstMarch 和 LondonFirstMarchPlusMonth)

  2. 因为添加 1 个月 londonFirstMarchPlusMonth 后,为了使其仍然是 12:00,它实际上已经提取了一个小时。这意味着基础纪元秒将与 utcFirstMarchPlusMonth 不同。

  3. 最后,当我们将区域转换为 UTC 时,londonFirstMarchPlusMonthToUtc 显示实际时间为 11:00。

  4. 如果我想要 1 个月后的约会。我应该只使用 UTC 并选择最后将其转换为伦敦/欧洲?

编辑:

也许我还不够清楚 - 抱歉。一个月是任意值,因此当添加到第一个日期时会产生属于 BST 的第二个日期。

正如前面提到的,也许一个月并不是一个很好的例子,因为它意味着不同的事情,具体取决于我们所处的月份。对我来说,重点是“月”将由 24 小时单位组成。 (正如 Ole.v.v. 所说)

我认为按照 UTC 时间操作并可选择将其转换为欧洲/伦敦时间是“我的问题”的解决方案

最佳答案

您的假设总体上是正确的。一些评论。

对于 1.,ZonedDateTime 将尝试保持小时相同。只有当这不可能时,它才会做其他事情。例如,人们可能期望以下内容打印时间 01:30:

    System.out.println(ZonedDateTime
.of(2018, 2, 25, 1, 30, 0, 0, ZoneId.of("Europe/London"))
.plusMonths(1));

打印

2018-03-25T02:30+01:00[Europe/London]

在向夏令时过渡期间,时间从凌晨 1 点提前到 2 点,因此当天没有 1:30 的时间。 ZonedDateTime 不会生成不存在的时间,因此在本例中它会选择 02:30。

对于 4.,“恰好一个月”有点难以严格定义,因为一个月可能是 28、29、30 或 31 天。但如果您想要 24 小时的倍数,使用 UTC 即可满足您的要求。

关于Java ZonedDateTime 和英国夏令时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48476228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com