【问题标题】:Why is 1942/4/3 00:00:00 an illegal date in java.util.Calendar?为什么 1942/4/3 00:00:00 在 java.util.Calendar 中是非法日期?
【发布时间】:2011-03-04 11:13:06
【问题描述】:

1942 年 4 月 3 日这一天有什么特别之处吗?出于某种原因,第 0 天(上午 12:00)的时间对于这个特定日期是非法的。当使用宽松日历但一天中的小时增加到 1(凌晨 1:00)时,接受该日期。

相关代码

java.util.Calendar calendar = java.util.Calendar.getInstance(
     java.util.TimeZone.getTimeZone("Europe/Helsinki")
);
calendar.clear();
calendar.setLenient(false);
calendar.set(1942, 3, 3, 0, 0, 0);
calendar.getTimeInMillis();

异常

java.lang.IllegalArgumentException: HOUR_OF_DAY
 at java.util.GregorianCalendar.computeTime(Unknown Source)
 at java.util.Calendar.updateTime(Unknown Source)
 at java.util.Calendar.getTimeInMillis(Unknown Source)

我真的希望日期不宽大,因为我不想接受不可能的日期。

--编辑

正如公认的答案和许多 cmets 指出的那样,这确实与夏令时有关。 1942 年 4 月 3 日 00:00 夏令时在 EEST/赫尔辛基时区进行了测试。目前,夏令时从 1981 年开始使用,时钟在 03:00 而不是 00:00 向前上弦。这意味着 java.util.Calendar 中不存在例如 2010 年 3 月 28 日 03:00。

我只需要在我的代码中为这个特定日期创建一个特殊情况。

【问题讨论】:

  • 对我来说很好。当然是负值,因为它是在纪元之前。你确定你给我们的正是你正在运行的吗?您是否尝试过完全运行该示例?
  • stackoverflow.com/questions/1586109/… 是的,根据您的时区设置,您没有那个时间!
  • 看起来肯定是与时区和夏令时有关的问题。
  • 所以问题真的应该是“哪里是 1942/4/3 00:00:00 一个非法日期...”
  • 不得不在其他日期面临类似的问题。那时我还没有被介绍给一个叫做夏令时的麻烦。 :)

标签: java calendar timezone


【解决方案1】:

时区和夏令时每年都在变化,而 1942 年在世界大部分地区是一个特别奇怪的时间 - 各个地区的易手速度相当快。亚洲的一些地区被标准化为“缅甸时间”,因此从当地时间过渡。

您的个人资料显示您在芬兰,这并不复杂。这个world-time database 将有问题的日期和时间认为是在正常夏令时的一小时内丢失。

【讨论】:

  • 链接很有意思,谢谢!在今天之前,我什至不知道芬兰在 1981 年之前有夏令时。
  • +1 用于验证侦探工作(检查 OP 的个人资料)
【解决方案2】:

只是猜测,但它与夏令时有关吗?我想这将取决于您的代码库的本地化(夏令时生效的确切日期)以及其他因素。

---EDIT--- 也许不是,因为那是星期五。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2015-07-19
相关资源
最近更新 更多