5、PHP 8.4 新特性 - Intl 扩展新增 intltz_get_iana_id 函数和 IntlTimeZone::getIanaID 方法
在 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
两个时区标识符一致。
请登录后再评论