【问题标题】:Odd results in Joda DateTime for 01.04.189301.04.1893 的 Joda DateTime 中的奇数结果
【发布时间】:2011-01-26 02:31:36
【问题描述】:

我的时区是 CET(柏林)。
在测试 Joda 的 DateTime 时,我注意到了一些奇怪的事情:

new DateTime(1893, 4, 1, 0, 0, 0, 0);
=>  java.lang.IllegalArgumentException: Illegal instant due to time zone offset transition: 

new DateTime(1893, 3, 31, 0, 0, 0, 0).toDate();
=>  Fri Mar 31 00:06:32 CET 1893

时区偏移 6 分 32 秒导致时间不存在??
我必须说这是非常出乎意料的,因为我没有指定任何时区信息,因此没想到会遇到这种问题。
如果 1893 年 3 月 CET(柏林)不存在 - 为什么 new DateTime(1893, 3, 31, 0, 0, 0, 0) 不选择与我指定的时间(即 0 分 0 秒)匹配的时区?

我有哪些选择可以使用 DateTime 获取正确时间?

-- 编辑--
问题似乎是 toDate()。在发布问题之前,我已经将其编辑了。
Joda 本身实际上工作正常:

new DateTime(1893, 3, 31, 0, 0, 0, 0);
=>  1893-01-01T00:00:00.000+00:53:28

只是转换为 Date 将部分偏移量移动到分钟和秒中。

【问题讨论】:

    标签: java jodatime


    【解决方案1】:

    如果您不指定时区,不幸的是 Joda Time 使用系统时区。是的,当时是柏林really did change(6 分 32 秒)。所以你指定了一个不存在的当地时间。

    “为什么不 [...] 选择与我指定的时间相匹配的时区”是什么意思? - 时区影响本地时间如何映射到 UTC。在您隐式指定的时区(通过让它选择您的系统默认值)该时间不存在;没有 UTC 即时映射到该本地时间。有许多时区映射到当地时间 - Joda 怎么知道该选择哪个?

    我同意使用系统默认时区对 Joda 来说是一个糟糕的举动(我们在 Noda Time 中修复了一个),但所有其他行为都绝对没问题。 (Noda Time 对这种情况有一个特定的例外,以将其与传递更明显不好的值区分开来,但我们走了。)

    如果您不想输入时区,那么您应该改用LocalDateTime

    【讨论】:

    • IOW:这不是错误,而是一项功能。从字面上看。
    • 感谢您的链接。我看到 CET 在该日期之前不存在。我看到 joda 实际上确实正确地创建了日期。我的问题似乎在于转换为 java.util.Date 不能很好地处理班次(请参阅我的编辑)。但这可能是 Date 的问题,而不是 DateTime。
    【解决方案2】:

    您是否尝试使用new DateTime(1893, 4, 1, 0, 0, 0, 0, DateTimeZone.UTC); 实例化该项目?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多