5、PHP 8.4 新特性 - Intl 扩展新增 intltz_get_iana_id 函数和 IntlTimeZone::getIanaID 方法

作者: 温新

图书: 【PHP 8.4 新特性】

阅读: 104

时间: 2025-01-17 10:04:55

在 PHP 8.4 中,Intl 扩展新增了两个功能:intltz_get_iana_id() 函数和 IntlTimeZone::getCanonicalID() 方法。这两个新功能都与时区(Time Zone)相关,用于提供更精确和一致的时区标识符。

在大多数情况下,返回值与传入的时区标识符相同。然而,在某些情况下,如果给定的时区标识符已被弃用或存在替代的时区标识符,新的 function/method 可以帮助规范化时区标识符

例如,对于塞浦路斯(Cyprus),有时使用 Asia/Nicosia,有时使用 Europe/Nicosia。新的 intltz_get_iana_id 函数和 IntlTimeZone::getIanaID() 方法提供了一种简单的方法来查找这些不一致之处,并检索正确的 IANA 标识符。

注意:

此函数仅在 Intl 扩展编译时使用了 ICU 74 版本或更高版本时才可用。有关上游 ICU 包中的更改,请参见 ICU-22452。

intltz_get_iana_id 函数

函数签名

/**
 * 从给定时区获取 IANA 标识符
 * 
 * @param string $timezoneId 时区标识符
 * @return string|false 成功时返回 IANA 标识符,失败时返回 false
 */
function intltz_get_iana_id(string $timezoneId): string|false {}

案例

<?php

declare(strict_types=1);

intltz_get_iana_id('Asia/Chongqing'); // Asia/Shanghai

intltz_get_iana_id('Mars'); // bool(false)

基本使用

<?php

declare(strict_types=1);

$tz     = IntlTimeZone::createTimeZone('Asia/Chongqing');
$innaId = intltz_get_iana_id($tz->getID());

// 输出: Asia/Shanghai,因为 'Asia/Chongqing' 被视为 'Asia/Shanghai' 的别名
echo $innaId; // Asia/Shanghai

IntlTimeZone::getIanaID() 方法

class IntlTimeZone {
  // ...

  /**
   * 从给定时区获取 IANA 标识符
   * 
   * @param string $timezoneId 时区标识符
   * @return string|false 成功时返回 IANA 标识符,失败时返回 false
   */
  public static function getIanaID(string $timezoneId): string|false {
  }

  // ...
}

参数

  • $tzid: 时区标识符,可以是一个 IANA 时区标识符(如 America/New_York),或者是其他格式的时区字符串(如 US/Eastern)。

返回值

返回一个字符串,表示 规范化后的 IANA 时区标识符,如果无法规范化该时区标识符,则返回 false

说明

IntlTimeZone::getIanaID() 方法用于将一个时区标识符(如 US/Eastern)规范化为标准的 IANA 时区标识符(如 America/New_York)。即使传入一个非标准的时区标识符(如 US/Eastern),该方法也会将其转换为 IANA 时区数据库中的标准格式。

案例

<?php

declare(strict_types=1);

$canonicalId = IntlTimeZone::getIanaID('Asia/Chongqing');
echo $canonicalId; // Asia/Shanghai

为什么需要这两个新特性?

在处理时区时,IANA 时区标识符被广泛使用,因为它们提供了一个全球通用的标准,确保时区信息在跨平台和跨地区时的一致性。IANA 时区标识符是非常重要的,尤其是在处理夏令时(DST)和跨时区的应用程序时。

  • intltz_get_iana_id() 允许开发者从 IntlTimeZone 对象中提取其 IANA 标识符,这对于获取一个时区的标准标识符非常有用。
  • IntlTimeZone::getIanaID() 允许开发者将一个时区标识符转换为 IANA 标准格式。这对于确保输入的时区标识符的一致性非常重要,尤其是在接收到非标准时区标识符时。

案例:结合使用 intltz_get_iana_id()IntlTimeZone::getIanaID()

<?php

declare(strict_types=1);

// 创建一个表示 'Asia/Chongqing' 时区的 IntlTimeZone 对象
$tz = IntlTimeZone::createTimeZone('Asia/Chongqing');
// 获取该时区的 IANA 标识符
$ianaId = intltz_get_iana_id($tz->getID());
echo "IANA 标识符: " . $ianaId . "\n";  // 输出: Asia/Shanghai

// 规范化时区标识符
$canonicalId = IntlTimeZone::getIanaID('Asia/Chongqing');
echo "规范化标识符: " . $canonicalId . "\n";  // 输出: Asia/Shanghai

if ($ianaId === $canonicalId) {
    echo "两个时区标识符一致。\n";
} else {
    echo "时区标识符不一致。\n";
}

输出

IANA 标识符: Asia/Shanghai
规范化标识符: Asia/Shanghai
两个时区标识符一致。
请登录后再评论