timezone - 提供带有偏移量的日期字符串(+0530)与在显示名称中单独指定时区(亚洲/加尔各答)

标签 timezone timezone-offset

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

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

  • 如果您使用偏移量,则无法说出您所在的时区,因为当时可能有多个时区使用此偏移量 - 检查 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/

    相关文章:

    ios - 如何显示带有日期的时区缩写

    c# - 将 Docker 上 ASP.NET Core 2.2 中的默认时区更改为 24 小时时间格式

    Android 时区和 DST 问题

    jquery - 使用 jQuery 将时间转换为不同时区

    swift - Swift 中的绝对 UTC 偏移量

    java - OffsetDateTime-打印偏移量而不是Z

    Joda Time 的 Java 时区问题

    python - 从 PST -8 0 到其字母名称的时区转换

    c# - Outlook session 安排采用 UTC(而非 EST)

    java - 如何在android列表中显示带有国家和城市名称的时区?