Java 1.6夏令时

landal79

我正在开发一个关注夏令时更改的关键应用程序。
我试图通过比较穿越夏时制更改的日期来手动模拟运行时可能发生的情况,因此我进行了以下测试。我当前的位置是意大利,所以今年从CEST(欧洲中部夏令时)到CET(欧洲中部时间)的更改发生在25/10。
我使用了完整的时区名称,时区为Europe/Rome

这是我所做的测试:

Calendar before = Calendar.getInstance(TimeZone.getTimeZone("Europe/Rome DST")); //CEST
before.set(Calendar.DAY_OF_MONTH, 25);
before.set(Calendar.MONTH, Calendar.OCTOBER);
before.set(Calendar.HOUR_OF_DAY, 2);
before.set(Calendar.MINUTE, 30);
before.set(Calendar.SECOND, 0);
before.set(Calendar.MILLISECOND, 0);

System.out.println(before.getTime());

Calendar after = Calendar.getInstance(TimeZone.getTimeZone("Europe/Rome")); //CET
after.set(Calendar.DAY_OF_MONTH, 25);
after.set(Calendar.MONTH, Calendar.OCTOBER);
after.set(Calendar.HOUR_OF_DAY, 2);
after.set(Calendar.MINUTE, 30);
after.set(Calendar.SECOND, 0);
after.set(Calendar.MILLISECOND, 0);

System.out.println(after.getTime());

System.out.println(before.compareTo(after));

输出为:

BEFORE DST CHANGE: Sun Oct 25 03:30:00 CET 2015
AFTER DST CHANGE: Sun Oct 25 02:30:00 CET 2015
before.compareTo(after): 1

比较结果是错误的,即2:30 CEST在2:30 CET之后,但是相反。

我不知道这是否是真正的考验。
有什么办法解决这个问题吗?
我也用joda time尝试过,但是结果是一样的。
提前致谢。

奥格里

您的问题是"Europe/Rome DST"无法识别getTimeZone(timeZoneId)
如果无法理解您的输入,则会默认返回GMT时区您可以通过getAvailableIDs以下getTimeZone链接查看可用的TimeZone ID列表上述链接下方的方法)。

应该注意的是,CEST它也不在列表中。要模拟CEST时区,可以选择以下解决方案之一:

  • 我建议您TimeZone.setRawOffset(int offsetInMs)自己设定CET和CEST的标准。
  • 使用相对于GMT定义的时区之一(例如,id为"Etc/GMT+1")。这将确保您使用的是TimeZone API可以理解的有效时区偏移量。
  • 在日历实例上设置DST偏移量Calendar.DST_OFFSET

通过使用最后一个解决方案,正确的测试代码是:

Calendar before = Calendar.getInstance(TimeZone.getTimeZone("Europe/Rome"));
before.set(Calendar.DST_OFFSET, 3600000);       
before.set(Calendar.DAY_OF_MONTH, 25);
before.set(Calendar.MONTH, Calendar.OCTOBER);
before.set(Calendar.HOUR_OF_DAY, 2);
before.set(Calendar.MINUTE, 30);
before.set(Calendar.SECOND, 0);
before.set(Calendar.MILLISECOND, 0);

System.out.println("BEFORE DST CHANGE: " + before.getTime());       

Calendar after = Calendar.getInstance(TimeZone.getTimeZone("Europe/Rome"));
after.set(Calendar.DAY_OF_MONTH, 25);
after.set(Calendar.MONTH, Calendar.OCTOBER);
after.set(Calendar.HOUR_OF_DAY, 2);
after.set(Calendar.MINUTE, 30);
after.set(Calendar.SECOND, 0);
after.set(Calendar.MILLISECOND, 0);

System.out.println("AFTER DST CHANGE: " + after.getTime());

System.out.println("before.compareTo(after): " + before.compareTo(after));

并输出:

BEFORE DST CHANGE: Sun Oct 25 02:30:00 CEST 2015
AFTER DST CHANGE: Sun Oct 25 02:30:00 CET 2015
before.compareTo(after): -1

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章