代码之家  ›  专栏  ›  技术社区  ›  ABlankenship

“标准”时区缩写是什么?

  •  17
  • ABlankenship  · 技术社区  · 12 年前

    我存储时区的时间 offset-from-UTC 对于使用此下拉列表的应用程序:

    <select id="timezone" name="timezone" >
    <option value="-12">[UTC - 12] Baker Island Time</option>
    <option value="-11">[UTC - 11] Niue Time, Samoa Standard Time</option>
    <option value="-10">[UTC - 10] Hawaii-Aleutian Standard Time, Cook Island Time</option>
    <option value="-9.5">[UTC - 9:30] Marquesas Islands Time</option>
    <option value="-9">[UTC - 9] Alaska Standard Time, Gambier Island Time</option>
    <option value="-8">[UTC - 8] Pacific Standard Time</option>
    <option value="-7">[UTC - 7] Mountain Standard Time</option>
    <option value="-6">[UTC - 6] Central Standard Time</option>
    <option value="-5">[UTC - 5] Eastern Standard Time</option>
    <option value="-4.5">[UTC - 4:30] Venezuelan Standard Time</option>
    <option value="-4">[UTC - 4] Atlantic Standard Time</option>
    <option value="-3.5">[UTC - 3:30] Newfoundland Standard Time</option>
    <option value="-3">[UTC - 3] Amazon Standard Time, Central Greenland Time</option>
    <option value="-2">[UTC - 2] Fernando de Noronha Time, South Georgia &amp; the South Sandwich Islands Time</option>
    <option value="-1">[UTC - 1] Azores Standard Time, Cape Verde Time, Eastern Greenland Time</option>
    <option value="0">[UTC] Western European Time, Greenwich Mean Time</option>
    <option value="1">[UTC + 1] Central European Time, West African Time</option>
    <option value="2">[UTC + 2] Eastern European Time, Central African Time</option>
    <option value="3">[UTC + 3] Moscow Standard Time, Eastern African Time</option>
    <option value="3.5">[UTC + 3:30] Iran Standard Time</option>
    <option value="4">[UTC + 4] Gulf Standard Time, Samara Standard Time</option>
    <option value="4.5">[UTC + 4:30] Afghanistan Time</option>
    <option value="5">[UTC + 5] Pakistan Standard Time, Yekaterinburg Standard Time</option>
    <option value="5.5">[UTC + 5:30] Indian Standard Time, Sri Lanka Time</option>
    <option value="5.75">[UTC + 5:45] Nepal Time</option>
    <option value="6">[UTC + 6] Bangladesh Time, Bhutan Time, Novosibirsk Standard Time</option>
    <option value="6.5">[UTC + 6:30] Cocos Islands Time, Myanmar Time</option>
    <option value="7">[UTC + 7] Indochina Time, Krasnoyarsk Standard Time</option>
    <option value="8">[UTC + 8] Chinese Standard Time, Australian Western Standard Time, Irkutsk Standard Time</option>
    <option value="8.75">[UTC + 8:45] Southeastern Western Australia Standard Time</option>
    <option value="9">[UTC + 9] Japan Standard Time, Korea Standard Time, Chita Standard Time</option>
    <option value="9.5">[UTC + 9:30] Australian Central Standard Time</option>
    <option value="10">[UTC + 10] Australian Eastern Standard Time, Vladivostok Standard Time</option>
    <option value="10.5">[UTC + 10:30] Lord Howe Standard Time</option>
    <option value="11">[UTC + 11] Solomon Island Time, Magadan Standard Time</option>
    <option value="11.5">[UTC + 11:30] Norfolk Island Time</option>
    <option value="12">[UTC + 12] New Zealand Time, Fiji Time, Kamchatka Standard Time</option>
    <option value="12.75">[UTC + 12:45] Chatham Islands Time</option>
    <option value="13">[UTC + 13] Tonga Time, Phoenix Islands Time</option>
    <option value="14">[UTC + 14] Line Island Time</option>
    

    使用PHP,我并没有最简单的选项来将这些转换为时区缩写,我唯一的编程选项是对大约400个时区缩写进行排序。有人知道这个下拉列表中的每个时区是什么,以及当夏令时开始时是什么吗?(我想我需要手动定义这两个列表)

    编辑:将这个列表解析为每个时区的一个缩写,但它们不是“流行”的缩写。

    我的新列表

    [-12] => kwat
    [-11] => bst
    [-10] => ahst
    [-9.5] => ckhst
    [-9] => ahdt
    [-8] => akdt
    [-7] => east
    [-6] => cst
    [-5] => act
    [-4.5] => ant
    [-4] => acst
    [-3.5] => negt
    [-3] => adt
    [-2] => addt
    [-1] => azost
    [-0] => azomt
    [1] => bst
    [2] => bdst
    [3] => amt
    [3.5] => irst
    [4] => adt
    [4.5] => aft
    [5] => aktt
    [5.5] => ist
    [5.75] => npt
    [6] => aktst
    [6.5] => burt
    [7] => almst
    [8] => bnt
    [8.75] => cwst
    [9] => cdt
    [9.5] => cast
    [10] => chost
    [10.5] => cst
    [11] => anat
    [11.5] => lhst
    [12] => anast
    [12.75] => chast
    [13] => anast
    [14] => anast
    

    代码:

    $abbr = DateTimeZone::listAbbreviations();
    
    $offsets=array('-12','-11','-10','-9.5','-9','-8','-7','-6',
        '-5','-4.5','-4','-3.5','-3','-2','-1','-0','1','2','3','3.5',
        '4','4.5','5','5.5','5.75','6','6.5','7','8','8.75','9','9.5',
        '10','10.5','11','11.5','12','12.75','13','14');
    $new = array();
    $count = 0;
    $found = false;
    while($count < count($offsets))
    {
        foreach($abbr as $k => $v)
        {
            foreach($v as $tz)
            {
                if($tz['offset'] == $offsets[$count]*3600)
                {
                    $new[$offsets[$count]] = $k;
                    $found = true;
                    break;
                }
            }
            if($found)
            {
                $found = false;
                break;
            }
        }
        $count++;
    }
    print_r($new);
    
    2 回复  |  直到 9 年前
        1
  •  35
  •   Community Mohan Dere    9 年前

    “标准”时区缩写是什么?

    这方面没有标准。任何人都不会正式协调时区缩写。在 IANA TZDB ,但其中很多都是随机选择的。关于应该使用哪些缩写,人们经常争论不休。例如,看看有多少关于澳大利亚缩写的帖子 in the list archives for April 2013 .

    可以找到另一个时区缩写列表 here 如果你仔细观察,你会发现很多都是模棱两可的。例如 CST 可以是“中央标准时间”(美国)、“中国标准时间”或“古巴标准时间”。 EST 可以是“东部标准时间”(美国)或“东部标准时”(澳大利亚)。

    一些非澳大利亚人可能更喜欢 AEST ,但谁能这么说呢 A 应该为澳大利亚而不是美国?

    另一个非常常见的例子,一些人使用 HAST 用于夏威夷,而其他人则使用 HST 因为他们可能不太关心阿拉斯加的阿留申群岛( A. 应该表示)。

    关键是,任何时区缩写的列表,无论你在哪里找到,都是主观的和固执己见的。没有标准。

    我正在使用此下拉列表按偏移量存储应用程序的时区:

    不要 这样做。时区是 一个偏移,其中有24个以上。请阅读 the timezone tag wiki ,尤其是标题为“时区!=偏移量”的部分。

    根据您的评论:

    我现在意识到了这一点,但我的应用程序逻辑的其余部分已经以这种方式依赖于它了,而且我今天只需要完成这一工作,所以没有时间更改它。

    然后,许多错误将继续出现在您的应用程序中。即使你的应用程序只是在美国运行,你也无法可靠地做到这一点。无论你使用什么语言或平台,任何这样做的实现都会有很多转换错误。

    我可以对这些阵列进行硬编码,我只是不知道美国以外的流行区域是什么,我想这样的列表已经存在了。

    当涉及到时区时,你不应该硬编码任何东西。时区规则一直在变化,因为它们由世界上每个国家的政治家控制。每年有多次更新发布到 IANA time zone database 。在PHP方面 PHP documentation 明确当前可用的版本,并通过 PECL's timezonedb -它从IANA中提取数据。

    关于什么是“受欢迎的”,这也是非常主观的。由于这样或那样的原因,TZDB中的所有区域都在那里。我所知道的唯一一个试图限制这种情况的地方是 ActiveSupport::TimeZone 来自RubyonRails。他们声称拥有“146个区域的有意义的子集”,您可以在 MAPPING 该页面上的常量。但他们没有说明他们是通过什么过程决定了什么是有意义的,而且有明显的遗漏。除非你知道每个用户的位置,否则我不会试图决定限制在什么区域。

    如果您想要的不是TZDB中所有578个区域的下拉列表,您可以尝试以下方法之一:

    • 目前 下拉列表。第一个选择国家。第二个选择该国境内的地区。在PHP中,当您调用 DateTimeZone::listIdentifiers ,它接受可选 $country 参数来筛选列表。

      谷歌日历的设置就是一个很好的例子:

      Google Calendar Time Zone Settings

    • 使用基于地图的控件,以便用户可以按位置选择时区。有很多这样的,但我最喜欢的是 this one 用于JavaScript。

      例如,它可能看起来像这样:

      Map-based TZ picker

    请注意,虽然它显示的是TZDB的缩写 EDT 这里-这只是为了显示方便。在引擎盖下,您选择的值如下 America/New_York .

    最终,您需要为每个用户保存的是他们的IANA时区密钥,例如 美国/纽约(_Y) 。仅使用值无法进行正确的时区转换 -5 ,因为你不知道它何时切换到 -4 .

    使现代化

    有一件事我没有从你最初的帖子中意识到,但你在评论中澄清了这一点,那就是你正在用它来选择目标事件时区。我想我应该先问一下上下文。我是从为用户选择一个时区的角度来处理这个问题的,而不是为特定事件选择一个特定的时区。

    你们所有人 真正地 一个事件在正确时刻的需要就是该时刻的偏移量。所以你可以使用一个下拉列表,就像你在问题中显示的那样,但我会省略任何区域名称。这将是一个从 UTC-12:00 UTC+14:00 。看起来您已经发现,也存在一些30分钟和45分钟的偏移。你可以验证你的假设 here 如果你愿意的话。

    然而,普遍的问题是,许多人没有 知道 偏移量应该是多少。通过将 标准 对于每个区域名称的偏移量,您可能会误导用户选择错误的偏移量。例如,他们可能在谈论夏天的一个日期,该日期应该在美国东部夏令时(-4),但他们选择-5,因为他们看到的是“东部”。因此,删除这些名称会有所帮助。

    如果你按照我最初建议的方式,让他们选择一个实际的IANA时区,这对许多场景来说会更好。然而,仍然有一种情况需要考虑——如何处理 模棱两可的 无效的 时间。这些情况发生在夏令时转换期间。

    例如,我可以选择 美国/纽约(_Y) ,并选择2013年11月3日凌晨1点的时间。由于回退过渡,有两种不同的情况(一种在EDT为-4,另一种在EST为-5)。因此,你的应用程序需要检查这一点,并询问用户他们是指这两者中的哪一个。同样,如果我在2013年3月10日凌晨2点进入,你的应用程序应该告诉我这个时间不存在于该区域(由于春季向前过渡)。

    无论哪种方法,当实际存储事件时间时,请确保存储日期-时间偏移组合,或者应用偏移量以获得UTC的日期-时间。你不希望有任何关于事件所代表的实际时刻的问题。

        2
  •  0
  •   Zon    4 年前

    你可以在一个文件中找到标准时区缩写,请看我的另一个答案- https://stackoverflow.com/a/72839900/1112963