时区卡萨布兰卡 (java) 的偏移量错误



我正在尝试在卡萨布兰卡时区建立一个日期(29/07/2014 at 02:55:08 am),并得到这个异常:

线程"main"中的异常 java.lang.IllegalArgumentException: HOUR_OF_DAY: 2 -> 3 at java.util.GregorianCalendar.computeTime(未知来源)

Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("Africa/Casablanca"));
cal.setLenient(false);
cal.set(Calendar.DATE, 29);
cal.set(Calendar.MONTH, 6); // July
cal.set(Calendar.YEAR, 2014);
cal.set(Calendar.HOUR_OF_DAY, 2);
cal.set(Calendar.MINUTE, 55);
cal.set(Calendar.SECOND, 8);
cal.getTime();

在 jre 1.7.0_71 和 1.8.0_20 中抛出异常,但在 1.6.0_30 中不会抛出异常。

据我所知,在那个特定时间没有夏令时的变化发生。知道吗?

谢谢!

JRE 并不总是使用最新的时区数据进行更新。 要保持最新状态,您必须使用 TZUpdater 实用程序。 Oracle 发布了 JRE 和 TZUpdater 的时区更新列表。 它显示最后一个 JRE 更新(截至我撰写本文时)是在 Java 7 的第 65 版和 Java 8 的第 11 版中 - 它是使用 tzdata 的 2014c 版本制作的。

如果我们查看 2014c 版 tzdata 的来源,我们可以看到当时摩洛哥的猜测确实猜测了 6 月 29 日至 7 月 29 日的斋月夏令时暂停。

Rule    Morocco 2014    only    -   Jun  29      3:00   0       -
Rule    Morocco 2014    only    -   Jul  29      2:00   1:00    S

当然,后来它被更新为克里斯回答中显示的值,当时埃及终于宣布了真正的日期。

你可以在这里看到一些来自原始猜测的面包屑,在 tz 列表档案中有很多关于埃及的讨论,从 5 月开始一直持续到 7 月。

它实际上确实对应于夏令时的变化。在摩洛哥,斋月期间暂停夏令时。有关详细信息,请参阅 http://www.timeanddate.com/news/time/egypt-morocco-dst-ramadan-2014.html。

2014年的时区数据条目如下:

Rule    Morocco 2014    only    -       Jun     28       3:00   0       -
Rule    Morocco 2014    only    -       Aug      2       2:00   1:00    S

相关内容

  • 没有找到相关文章

最新更新