gpt4 book ai didi

java - 如何从 UTC 时间 + TimeZone ID 计算挂钟时间?

转载 作者:搜寻专家 更新时间:2023-11-01 02:14:54 24 4
gpt4 key购买 nike

我一直在谷歌搜索这个问题,但找不到清晰明确的文档。

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

我正在寻找经过测试的代码示例。谢谢。

最佳答案

当你说你在 UTC 中有时间时,我假设你在 Calendar 中保存它(Date 没有时区的概念,尽管有误导性的 toString( ))。如果你有时间在 String 中,您可以轻松地解析它或像这里这样的日历实例:

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

summer 表示 2011 年 6 月 27 日上午 9:00 UTC。现在您需要做的就是将时区从 UTC 更改为澳大利亚墨尔本:

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 小时)。

差异证明更改 Calendar 上的时区会考虑 DST。在 UTC 时区的 6 月,澳大利亚处于冬季,因此他们不遵守 DST。

但是在 UTC 的冬天,澳大利亚是夏天 - 他们通过将时钟移动一小时来切换到 DST。这就是为什么冬季时差为 +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,而墨尔本是 19:00(+10 小时)。

但是在夏天的同一时间:

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

墨尔本实际上是世界标准时间 7:00 和 17:00! +8 小时!

不知何故,人们假设两个时区之间的差异总是恒定的(“奥斯陆和墨尔本之间的差异总是 10 小时)——这不是 是的,尤其是当考虑到不同的半球时。

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

另请记住,DST 的第一天和最后一天不是全局性的,而是为每个时区任意选择的。这意味着 9 小时的差异也是可能的(!)查看今年 4 月 1 日。

关于java - 如何从 UTC 时间 + TimeZone ID 计算挂钟时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8286163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com