提供带偏移量的日期字符串 (+0530) 与在显示名称中单独指定时区 (Asia/Calcutta)
Providing date string with offsets (+0530) vs specifying timezone separately in display name (Asia/Calcutta)
提供带偏移值的日期字符串(例如+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-01 更改为
+06:30
- 于 1942-05-15 更改为
+05:30
- 1942-09-01,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[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-01 中创建一个偏移量为 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,没有“更好”的解决方案,只有每种方法之间的差异。您必须针对每种情况选择最适合的。
提供带偏移值的日期字符串(例如+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-01 更改为
+06:30
- 于 1942-05-15 更改为
+05:30
- 1942-09-01,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[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-01 中创建一个偏移量为 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,没有“更好”的解决方案,只有每种方法之间的差异。您必须针对每种情况选择最适合的。