编程

PHP 8.4: Intl: 新增 intltz_get_iana_id 函数和 IntlTimeZone::getCanonicalID 方法

53 2024-12-02 01:48:00

在 PHP 8.4 中,Intl 扩展提供了一个名为 intltz_get_iana_id 的新函数以及一个 IntlTimeZone 类上的新的静态方法IntlTimeZone::getIanaID(),其返回 IANA 时区 ID。

大多数情况下,其返回值与传递的时区标识符相同。然而,在给定的时区标识符被弃用或有替换的的时区标识符的情况下,这些新函数/方法有助于规范时区标识符。

例如,塞浦路斯的时区,Asia/Nicosia,有时被用作 Europe/Nicosia。新的 intltz_get_iana_id 函数和 IntlTimeZone::getIanaID() 方法提供了一种发现这些不一致并检索时区的正确 iana 标识符的简单方法。

有关受影响时区标识符的列表,请参阅 IANA tzdata/backward

只有在当 Intl 扩展使用 ICU 74 或更高版本编译时,此功能才可用。

intltz_get_iana_id('Europe/Berlin'); // Valid, returns the same
// "Europe/Berlin"

IntlTimeZone::getIanaID('America/New_York'); // Valid, returns the same
// "America/New_York"
intltz_get_iana_id('Mars'); // Invalid, returns false
// false
intltz_get_iana_id('Europe/Nicosia'); // Returns as Asia/Nicosia
// "Asia/Nicosia"

IntlTimeZone::getIanaID('Asia/Chongqing'); // Duplicating existing location
// "Asia/Shanghai"

intltz_get_iana_id 函数摘要

/**
 * Get the IANA identifier from a given timezone
 * @param string $timezoneId
 * @return string|false
 */
function intltz_get_iana_id(string $timezoneId): string|false {}
  • intltz_get_iana_id 在全局命名空间中声明
  • 传递无效的时区 ID 将返回false
  • 另请参阅: intltz_get_canonical_id 类似,但返回的是系统规范时区 ID,其与 IANA 时区列表部分重叠(不完全)。

IntlTimeZone::getIanaID()

class IntlTimeZone {
  // ...

  /**
   * Get the IANA identifier from a given timezone
   * @param string $timezoneId
   * @return string|false
   */
  public static function getIanaID(string $timezoneId): string|false {}

  // ...
}
  • 新增的 getIanaID 方法是 static 静态方法。
  • intltz_get_iana_id 函数的别名。
  • 传递无效的时区 ID 将返回 false
  • 另请参阅: IntlTimeZone::getCanonicalID 与此类似,但返回的是系统规范时区 ID,其与 IANA 时区列表部分重叠(不完全)。

向后兼容性影响

新增的 intltz_get_iana_id 函数在全局命名空间中声明,除非 PHP 应用声明了同名函数,这不会导致任何兼容性问题。

继承 IntlTimeZone 而不实现不兼容的 getIanaID 方法的 PHP 类也不会遇到任何向后兼容性问题。

IANA 时区标识符数据来自 ICU 库。通过硬编码需要“规范化”的时区标识符,可以在用户空间 PHP 对 intltz_get_iana_id 函数进行 polyfill。然而,这可能不可靠,需要额外的维护来保持此列表的最新状态。