代码之家  ›  专栏  ›  技术社区  ›  Sohbati

Joda time日期时间。withTimeAtStartOfDay()日期(2036,3,21)与亚洲/德黑兰时区错误

  •  1
  • Sohbati  · 技术社区  · 7 年前

    在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

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

    我的系统配置:

    • Java版本:1.7.0\u 72- 我必须使用Java 7
    • Joda时间:2.9.9

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   Jim Garrison    7 年前

    这是因为伊朗在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点的时间。

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