【发布时间】:2020-03-09 10:20:19
【问题描述】:
对于过去的某个日期,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)
[...]
我在这里做错了什么?
提前感谢您的回答!
最好的问候, 马库斯
【问题讨论】:
-
欧洲/柏林时区的 FWIW 我得到和你一样的结果。当我在欧洲/哥本哈根时区运行您的代码时,我全年都会遇到差异,从
GC: 01.01.1893 (1) -> ZDT: 31.12.1892 (366)到GC: 30.12.1893 (364) -> ZDT: 29.12.1893 (363)。
标签: java datetime zoneddatetime