Joda-time DateTime.withTimeAtStartOfDay() 在 Asia/Tehran 时区的日期 (2036,3,21) 中产生错误结果
Joda-time DateTime.withTimeAtStartOfDay() wrong result in date (2036,3,21) with Asia/Tehran time zone
在 Joda-Time 版本 2.9.9 中,我想删除 DateTime
变量的时间部分。
仅适用于时区 Asia/Tehran
和某些日期,例如 (2036-03-21、2037-03-21, ...) 它 returns 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
时间不为零。这只发生在区域 Asia/Tehran
.
我的系统配置:
- Java 版本:1.7.0_72 - 我必须使用 Java 7
- 乔达时间:2.9.9
我通过将DateTime
转换为LocalDate
解决了这个问题,但我想知道为什么会出现这个问题?
这是因为伊朗在 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 点的时间。
在编写处理时间的代码时,请始终牢记与预期结果的意外小偏移几乎肯定是由于管理时间更改造成的。对于历史日期更是如此,其中偏移量可以是任意数量的分钟和秒,而不仅仅是整小时或半小时。
在 Joda-Time 版本 2.9.9 中,我想删除 DateTime
变量的时间部分。
仅适用于时区 Asia/Tehran
和某些日期,例如 (2036-03-21、2037-03-21, ...) 它 returns 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
时间不为零。这只发生在区域 Asia/Tehran
.
我的系统配置:
- Java 版本:1.7.0_72 - 我必须使用 Java 7
- 乔达时间:2.9.9
我通过将DateTime
转换为LocalDate
解决了这个问题,但我想知道为什么会出现这个问题?
这是因为伊朗在 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 点的时间。
在编写处理时间的代码时,请始终牢记与预期结果的意外小偏移几乎肯定是由于管理时间更改造成的。对于历史日期更是如此,其中偏移量可以是任意数量的分钟和秒,而不仅仅是整小时或半小时。