Joda-time DateTime.withTimeAtStartOfDay()与亚洲/德黑兰时区

时间:2018-02-14 06:58:44

标签: java date time jodatime

在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

我的系统配置:

  • Java版本:1.7.0_72 - 我必须使用Java 7
  • Joda-Time:2.9.9

我通过将DateTime转换为LocalDate来解决了这个问题,但我想知道为什么会出现这个问题?

1 个答案:

答案 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点的那个小时在那个特定的日子里不存在。

在编写处理时间的代码时,请务必记住,预期结果的意外小偏差几乎肯定是由于管理时间的变化。对于历史日期来说更是如此,其中偏移可以是任何数分钟和秒,而不仅仅是整数或半小时。