如何从UTC时间TimeZone ID计算墙上时间?

我一直在谷歌搜索这个问题,但找不到明确和明确的文件.

假设我有一个UTC时间和一个TimeZone ID,我如何计算Java中的墙上时间(= UTC时间时区偏移夏令时),知道一年中的夏令时变化?

我正在寻找一个经过测试的代码示例.谢谢.

解决方法:

当你说你有时间在UTC时,我假设你在日历中持有它(日期没有时区的概念,尽管误导了toString()).如果你有时间,例如在String中,您可以轻松地解析它或日历实例,如下所示:

Calendar summer = new GregorianCalendar(DateUtils.UTC_TIME_ZONE);
summer.set(2011, Calendar.JUNE, 27, 9, 0, 0);

夏季代表2011年6月27日上午9点.现在您需要做的就是将时区从UTC更改为澳大利亚Melbounre:

summer.setTimeZone(TimeZone.getTimeZone("Australia/Melbourne"));

我将使用FastDateFormat正确打印日期:

final FastDateFormat formatter = FastDateFormat.getDateTimeInstance(FastDateFormat.SHORT, FastDateFormat.SHORT);

System.out.println(formatter.format(summer));

墨尔本的时间是19:00(10小时).但是将日期更改为冬季:

Calendar winter = new GregorianCalendar(DateUtils.UTC_TIME_ZONE);
winter.set(2011, Calendar.DECEMBER, 27, 9, 0, 0);
System.out.println(formatter.format(winter));

突然间,墨尔本的时间是20:00(11小时).

差异证明,更改日历上的时区需要考虑DST.在6月的UTC时区,澳大利亚有冬天,因此他们没有观察夏令时.

但是在UTC的冬天,澳大利亚还有夏天 – 他们通过将时钟移动一小时来切换到夏令时.这就是为什么在冬季,差异是11小时而不是夏季UTC的10小时.

可是等等!当考虑DST的多个时区被考虑时,它变得更加有趣.首先,我在欧洲/奥斯陆时区创建相同的日期:

Calendar winter = new GregorianCalendar(TimeZone.getTimeZone("Europe/Oslo"));
winter.set(2011, Calendar.DECEMBER, 27, 9, 0, 0);

奥斯陆的9:00在冬季是8:00 UTC,但在墨尔本是19:00(10小时).

但是在夏天的同一时间:

Calendar summer = new GregorianCalendar(TimeZone.getTimeZone("Europe/Oslo"));
summer.set(2011, Calendar.JUNE, 27, 9, 0, 0);

实际上是墨尔本的7:00 UTC和17:00! 8小时!

不知何故,人们认为两个时区之间的差异总是不变的(“奥斯陆和墨尔本之间的差异总是10小时) – 这是不正确的,尤其是考虑到不同的半球时.

实际上在Oslo冬季(没有DST,UTC 1)DST在Melbourne(UTC 11)中观察到.另一方面,虽然在奥斯陆有夏季并且观察到夏令时(UTC 2),但在墨尔本没有观测到(UTC 10).现在很明显,为什么差异在8到10小时之间变化,具体取决于一年中的某一天.

还要记住,夏令时的第一天和最后一天不是全球性的,而是为每个时区任意选择.这意味着9小时的差异也是可能的(!)例如.今年4月1日退房.

上一篇:php – 如何转换为UTC


下一篇:PHP将mktime结果转换为UTC