Java Joda time DateTime.withTimeAtStartOfDay()错误导致日期(2036,3,21)与亚洲/德黑兰时区

Java Joda time DateTime.withTimeAtStartOfDay()错误导致日期(2036,3,21)与亚洲/德黑兰时区,java,date,time,jodatime,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.withTimeAtStartOfd

在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-21T01:00:00.000+04:30

预期结果:

2036-03-21T00:00:00.000+04:30

时间不是零。这只发生在亚洲/德黑兰地区

我的系统配置:

  • Java版本:1.7.0_72-我必须使用Java 7
  • 乔达时间:2.9.9

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

这是因为伊朗在3月21日或22日00:00(无论哪一天包含天文分点)将标准时间转换为夏令时。 2036年,这种情况发生在21日

简而言之,时间从
2036/03/20 24:00
跳到
2036/03/21 01:00
。该特定日期不存在从午夜到凌晨1点的时间


在编写处理时间的代码时,请始终记住,与预期结果的意外小偏移几乎肯定是由于管理时间更改造成的。对于历史日期更是如此,偏移量可以是任意数量的分和秒,而不仅仅是整小时或半小时。

如果你看9月21日,你会得到什么?你读过“我通过将DateTime转换为LocalDate解决了这个问题”吗?LocalDate没有时间组件,因此该值不会包含您期望的小时数。此问题仅发生在2036-03-21之后的日期,并且仅发生在每年的3月21日。我知道伊朗在春季(3月21日)的夏时制。但是对于年份:2035,为什么此方法(withTimeAtStartOfday())返回“2035-03-21T00:00:00”?因为一天的开始时间是01:00