提供带有偏移值的日期字符串(例如 +0530
)而不是单独指定其时区作为时区显示名称(例如 Asia/Calcutta
)有什么好处?
最佳答案
摘要
偏移量准确地告诉您相对于 UTC 的日期和时间,因此它是明确的。时区会告诉您该日期遵循哪些规则(因此您可以推断它是否处于夏令时)。
详细信息
我不会说有好处,但使用其中一种或另一种时会有所不同。
偏移量只是与 UTC 的差异:+0530
表示“比 UTC 早 5 小时 30 分钟”。
时区是一个地区在其历史上所有不同偏移量的列表。对于 Asia/Calcutta
时区,history (至少是我在 Java 8 中得到的)是:
- 1880 年之前:偏移量为
+05:53:28
(在发明 UTC 之前,每个城市都有自己的本地时间,导致这些奇怪的偏移量) - 从 1880 年到 1941 年:使用偏移量
+05:53:20
- 1941 年 10 月 1 日更改为
+06:30
- 1942 年 5 月 15 日更改为
+05:30
- 1942 年 9 月 1 日开始夏令时,偏移量变为
+06:30
- 1945 年 10 月 15 日,夏令时结束,偏移量重新设置为
+05:30
- 此后,偏移量为
+05:30
,夏令时没有更改
下面列出了使用时区和偏移量之间的主要区别。我还给出了 Java 8 中的一些示例,只是为了更好地说明:
- 如果您使用时区,则将根据其历史记录以及该日期和时间的有效偏移量“计算”偏移量
示例:在 Asia/Calcutta
时区创建一些日期:
// get the timezone
ZoneId zone = ZoneId.of("Asia/Calcutta");
// 1941-10-01 - when the offset changed to `+06:30`
System.out.println(ZonedDateTime.of(1941, 10, 1, 10, 0, 0, 0, zone)); // 1941-10-01T10:00+06:30[Asia/Calcutta]
// 2017 - the current offset is `+05:30`
System.out.println(ZonedDateTime.of(2017, 10, 1, 10, 0, 0, 0, zone)); // 2017-10-01T10:00+05:30[Asia/Calcutta]
输出为:
1941-10-01T10:00+06:30[Asia/Calcutta]
2017-10-01T10:00+05:30[Asia/Calcutta]
在第一种情况下,日期为 1941-10-01(当偏移量更改为 +06:30
时),因此 API 检查时区历史记录并获取该日期的有效偏移量.
第二种情况 (2017-10-01) 也会发生同样的情况 - 它获取该日期的有效偏移量,即 +05:30
。
还有更多:如果我得到 1941-10-01 之前的一天,偏移量将是前一天(根据时区历史记录,在 1941-10-01 之前,偏移量是 +05:53: 20
):
ZonedDateTime z = ZonedDateTime.of(1941, 10, 1, 10, 0, 0, 0, zone);
System.out.println(z.minusDays(1)); // 1941-09-30T10:00+05:53:20[Asia/Calcutta]
输出为:
1941-09-30T10:00+05:53:20[Asia/Calcutta]
请注意,偏移量会自动更改。 API 检查时区历史记录,发现前一天(1941-09-30)的偏移量不同,并进行相应的调整。
- 如果您使用偏移量,则无法说出您所在的时区,因为当时可能有多个时区使用此偏移量 - 检查 this list查看有多少个时区可以同时使用相同的偏移量。
示例:创建 1941 年 10 月 1 日的日期,偏移量 06:30
并获取上一个日期
ZonedDateTime zdt = ZonedDateTime.of(1941, 10, 1, 10, 0, 0, 0, ZoneId.of("+06:30"));
System.out.println(zdt); // 1941-10-01T10:00+06:30
System.out.println(zdt.minusDays(1)); // 1941-09-30T10:00+06:30
输出为:
1941-10-01T10:00+06:30
1941-09-30T10:00+06:30
请注意与前面示例的区别。两个日期都有偏移量 +06:30
。这是因为我没有使用时区,因此没有历史记录可供检查,并且偏移量永远不会改变。
IMO,没有“更好”的解决方案,只有每种方法之间的差异。您必须选择最适合每种情况的方法。
关于timezone - 提供带有偏移量的日期字符串(+0530)与在显示名称中单独指定时区(亚洲/加尔各答),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44822435/