我正在开发一个关注夏令时更改的关键应用程序。
我试图通过比较穿越夏时制更改的日期来手动模拟运行时可能发生的情况,因此我进行了以下测试。我当前的位置是意大利,所以今年从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的标准。"Etc/GMT+1"
)。这将确保您使用的是TimeZone API可以理解的有效时区偏移量。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] 删除。
我来说两句