提供带偏移量的日期字符串 (+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 中给出了一些例子,只是为了更好地说明:

  1. 如果您使用时区,将根据其历史记录以及该日期和时间的有效偏移量“计算”偏移量

示例:在 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) 的偏移量不同,并相应地进行调整。

  1. 如果你使用一个偏移量,你不能说你在哪个时区,因为当时可能有多个时区使用这个偏移量 - 检查 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,没有“更好”的解决方案,只有每种方法之间的差异。您必须针对每种情况选择最适合的。