【问题标题】:Get longer time zone name in PHP在 PHP 中获取更长的时区名称
【发布时间】:2015-06-19 18:02:07
【问题描述】:

给定像“EST”这样的时区缩写,我可以使用timezone_name_from_abbr 得到“America/New York”。有没有返回类似“东部标准时间”的函数?

【问题讨论】:

    标签: php timezone abbreviation


    【解决方案1】:

    一般来说,您不应该信任timezone_name_from_abbr 函数,因为它只返回它找到的带有匹配缩写的first 条目。时区缩写不是唯一的。例如,有 5 个不同的时区共享缩写“CST”。有关歧义的更多示例,请参阅维基百科上的 this list of abbreviations

    作为 PHP 的特定情况,请考虑缩写“IST”。人们可能期望timezone_name_from_abbr("IST") 返回代表印度标准时间的"Asia/Kolkata"。但是,它实际上返回"Asia/Jerusalem",代表以色列标准时间。两个时区都使用 IST 缩写,但 "Asia/Jerusalem" 按字母顺序排在第一位。

    考虑到这一点,您现在应该明白为什么函数在仅给出“EST”的情况下返回“东部标准时间”也是不切实际的。虽然 EST 可能是可行的,但并非在所有情况下都有效。还要考虑到“东部标准时间”是英语,并且还有针对不同语言的其他缩写和文字说明。

    有一个项目包含您正在谈论的信息,它来自 Unicode,称为Common Locale Data Repository(或 CLDR)。使用 CLDR 数据,您将能够编写接受时区标识符(例如 "America/New_York")和语言/区域设置代码(例如 "en-US")并返回缩写“ET”、“EST”和“EDT”的函数”,以及名称“东部时间”、“东部标准时间”和“东部夏令时间”。然后,您需要根据上下文和/或您所谈论的具体时间来决定使用哪个名称和缩写。

    我为 .NET 编写了这样一个库,名为 TimeZoneNames。对于 PHP,您需要类似的东西。我不知道有什么可以推荐给 PHP 的,但也许有人已经写了一个,或者你可以通过直接使用 CLDR 源数据来创建你需要的函数。

    【讨论】:

    • 感谢您非常详尽的回答!
    【解决方案2】:

    这是我追求了一段时间的东西,并且看到其他人正在寻找与上次推送所需的相同的功能:)

    webit4me/timezone,是一个 PHP 工具,可以帮助获取给定时区的名称、位置或偏移量。

    该工具还为具有类似缩写的时区提供了一种解决方法。

    即在 Matt's example 的 IST 中,我们有 3 个不同的时区

    1. 印度标准时间 (UTC +5:30)
    2. 爱尔兰标准时间 (UTC +1:00)
    3. 以色列标准时间 (UTC +2:00)

    默认 IST 对象将引用第一次出现,然后我们将有另外 2 个对象 IST100 和 IST200 来处理爱尔兰和以色列标准时间。请注意,100200 后缀来自时区的偏移量,例如UTC +130 将是 130。

    希望这个包会有所帮助,如果需要,请随时标记并做出调整http://github.com/webit4me/timezone

    【讨论】:

      【解决方案3】:

      从缩写中获取较长的名称是不可靠的,但是如果您使用DateTime对象,并且在设置默认时区时使用长名称,或者在创建DateTime对象时。在格式字符串中使用 T 将为您提供 3 个字母的缩写,但您可以像这样获得长名称:

      date_default_timezone_set('America/Chicago');
      $date = new DateTime('2/3/2022 02:11:17');
      
      echo "\n" . $date->format('Y-m-d h:i:s T');
      /* Displays 2022-02-03 02:11:17 CST "; */
      
      $t = $date->getTimezone();
      echo "\nTimezone: " . $t->getName();
      /* Displays Timezone: America/Chicago */
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-17
        • 2020-07-23
        • 2012-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-28
        • 2021-07-24
        相关资源
        最近更新 更多