在Joda-Time版本2.9.9中,我想删除DateTime
变量的时间部分。
仅适用于时区Asia/Tehran
和某些日期(如2036-03-21,2037-03-21,...),它会在结果的时间部分返回1:00:00
。
我还检查了Joda-Time源代码,但我找不到任何问题。
代码是:
DateTime dt = new DateTime(2036, 03, 21, 10, 0, DateTimeZone.forID(Asia/Tehran));
dt = dt.withTimeAtStartOfday();
实际结果:
2036-03-21T0的 1:00:00.000 04:30
预期结果:
2036-03-21T的 00:00:00.000 04:30
时间不是零。这仅适用于区域Asia/Tehran
。
我的系统配置:
我通过将DateTime
转换为LocalDate
来解决了这个问题,但我想知道为什么会出现这个问题?
答案 0 :(得分:3)
这是因为伊朗在3月21日或22日00:00(无论哪一天包含天文昼夜平分点)从标准时间切换到夏令时。 在2036年,这发生在21日。 In 2018 it happens to fall on the 22nd
简而言之,时间从2036/03/20 24:00
跳到2036/03/21 01:00
。从那个午夜到凌晨1点的那个小时在那个特定的日子里不存在。
在编写处理时间的代码时,请务必记住,预期结果的意外小偏差几乎肯定是由于管理时间的变化。对于历史日期来说更是如此,其中偏移可以是任何数分钟和秒,而不仅仅是整数或半小时。