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

时间:2017-06-29 10:19:19

标签: timezone timezone-offset

提供带偏移值的日期字符串(例如curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);)而不是将其时区单独指定为TimeZone显示名称(例如+0530)有什么好处?

1 个答案:

答案 0 :(得分:2)

摘要

偏移量确切地告诉您相对于UTC的日期和时间是什么,因此它不含糊。时区会告诉您此日期遵循的规则(因此您可以推断它是否在DST中)。

详细

我不会说有好处,但是当你使用其中一种时会有所不同。

偏移量只是与UTC的差异:+0530表示"比UTC和#34;提前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. 如果您使用时区,则偏移将被"计算"基于其历史和该日期和时间的有效抵消
  2. 示例:在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之前,偏移是{{1} }):

    +05:53:20

    输出结果为:

      

    1941-09-30T10:00 + 05:53:20 [亚/加尔各答]

    请注意,偏移量会自动更改。 API检查时区历史并查看前一天(1941-09-30),偏移量不同并相应地进行调整。

    1. 如果您使用偏移量,则无法说明您所在的时区,因为此时可能有多个时区使用此偏移量 - 请检查this list以查看有多少时区可以同时使用相同的偏移量。
    2. 示例:使用偏移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-10-01创建日期并获取上一个日期

      06:30

      输出结果为:

        

      1941-10-01T10:00 + 06:30个
        1941-09-30T10:00 + 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 。那是因为我没有使用时区,因此无法检查历史记录,且偏移量永远不会改变。

      IMO,没有"更好"解决方案,每种方法之间只有差异。您必须为每个案例选择最佳选择。