Summary
偏移量准确地告诉您相对于 UTC 的日期和时间,因此它是明确的。时区会告诉您该日期遵循哪些规则(因此您可以推断它是否处于夏令时)。
Details
我不会说有好处,但使用其中一种或另一种时会有所不同。
偏移量只是与 UTC 的差异:+0530
意思是“比 UTC 早 5 小时 30 分钟”。
时区是一个地区在其历史上所有不同偏移量的列表。为了Asia/Calcutta
时区,history https://www.timeanddate.com/time/zone/india/kolkata?year=1925(至少是我在 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 日,DST 开始,偏移量变为
+06:30
- 1945 年 10 月 15 日,DST 结束,偏移量重新设置为
+05:30
- 从那时起,偏移量是
+05:30
,没有 DST 更改
下面列出了使用时区和偏移量之间的主要区别。我还给出了 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[亚洲/加尔各答]
2017-10-01T10:00+05:30[亚洲/加尔各答]
在第一种情况下,日期是 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[亚洲/加尔各答]
请注意,偏移量会自动更改。 API 检查时区历史记录,发现前一天 (1941-09-30) 的偏移量不同,并进行相应的调整。
- 如果您使用偏移量,则无法说出您所在的时区,因为当时可能有多个时区使用该偏移量 - 检查这个清单 https://en.wikipedia.org/wiki/List_of_tz_database_time_zones查看有多少个时区可以同时使用相同的偏移量。
示例:创建 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,没有“更好”的解决方案,只有每种方法之间的差异。您必须选择最适合每种情况的方法。