PHP 8.4: Intl: 新增 intltz_get_iana_id 函数和 IntlTimeZone::getCanonicalID 方法
在 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
// falseintltz_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。然而,这可能不可靠,需要额外的维护来保持此列表的最新状态。
