gpt4 book ai didi

Java Gregorian Calendar.to ZonedDateTime() 为过去的日期返回不同的日期

转载 作者:行者123 更新时间:2023-11-30 07:39:53 24 4
gpt4 key购买 nike

对于过去的某个日期,GregorianCalendar.toZonedDateTime() 返回一个休息 1 天的日期。

对于 1893 年 4 月 2 日,toZonedDateTime() 返回相同的日期,对于 1893 年 4 月 1 日,ZonedDateTime 显示 1893 年 3 月 31 日,并且“一年中的某一天”值也有所不同。这个“神奇”日期之前的日期总是有一个偏移量。

下面是一些示例代码:

final GregorianCalendar gc = new GregorianCalendar(1893, 0, 1); // Set to 1st January 1893
for(int i = 1; i < 365; i++) {
gc.set(Calendar.DAY_OF_YEAR, i); // Update day of year
final ZonedDateTime zdt = gc.toZonedDateTime();

System.out.println(String.format(
"GC: %02d.%02d.%d (%d) -> ZDT: %02d.%02d.%d (%d)",
gc.get(Calendar.DAY_OF_MONTH),
gc.get(Calendar.MONTH) + 1, // "+1" is needed, because GregorianCalendar encodes January as 0.
gc.get(Calendar.YEAR),
gc.get(Calendar.DAY_OF_YEAR),
zdt.getDayOfMonth(),
zdt.getMonthValue(),
zdt.getYear(),
zdt.getDayOfYear()
));
}

运行代码时,你会得到输出

[...]
GC: 31.03.1893 (90) -> ZDT: 30.03.1893 (89)
GC: 01.04.1893 (91) -> ZDT: 31.03.1893 (90)
GC: 02.04.1893 (92) -> ZDT: 02.04.1893 (92)
GC: 03.04.1893 (93) -> ZDT: 03.04.1893 (93)
[...]

我在这里做错了什么?

预先感谢您的回答!

最好的问候,马库斯

最佳答案

你的系统时区是什么?

我怀疑您可能在 1893 年 4 月 1 日观察到或观察到 DST 类型更改的语言环境。尝试打印出 ZonedDateTimeoffset 值在循环的每次迭代中。

或者可以通过删除时区因素来收集更多信息 LocalDateTime.ofInstant(zdt.toInstant(), ZoneOffset.UTC)


这似乎与柏林选择在该日期采用 CET 有关

The tzdata file europe contains only one zone Europe/Berlin for all of Germany.

It is not the best possible choice for several reasons:

- Berlin started CET only in 1893, later than several southern states.

https://mm.icann.org/pipermail/tz/2011-August/008736.html

关于Java Gregorian Calendar.to ZonedDateTime() 为过去的日期返回不同的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58840159/

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