timezone_identifiers_list 是 PHP 内置函数,用来获取所有可用的时区标识符。它的用法非常简单:
<?php
$timezones = timezone_identifiers_list();
foreach ($timezones as $timezone) {
echo $timezone . PHP_EOL;
}
?>
该代码会输出 PHP 支持的所有时区名称,比如 Asia/Shanghai、Europe/London、America/New_York 等。
通过 DateTime 类可以创建一个日期时间对象。默认情况下,若未指定时区,则会使用服务器默认时区。我们也可以在创建时传入一个时区对象。
<?php
$date = new DateTime('2025-05-31 15:00:00', new DateTimeZone('UTC'));
echo $date->format('Y-m-d H:i:s T') . PHP_EOL;
?>
这段代码会输出:2025-05-31 15:00:00 UTC。
假如我们想把上面的时间转换为中国上海时间,可以通过 setTimezone 方法实现:
<?php
$date->setTimezone(new DateTimeZone('Asia/Shanghai'));
echo $date->format('Y-m-d H:i:s T') . PHP_EOL;
?>
输出结果将变为:2025-05-31 23:00:00 CST,即对应的北京时间。
有时,我们可能想要让用户从所有时区列表中选择一个,然后程序根据选择调整时间。示例代码如下:
<?php
// 获取所有时区
$timezones = timezone_identifiers_list();
// 假设用户选择的时区是 'Europe/London'
$userSelectedTimezone = 'Europe/London';
// 先创建一个UTC时间的DateTime对象
$date = new DateTime('2025-05-31 15:00:00', new DateTimeZone('UTC'));
// 验证用户选择的时区是否有效
if (in_array($userSelectedTimezone, $timezones)) {
$date->setTimezone(new DateTimeZone($userSelectedTimezone));
echo "用户选择的时间是:" . $date->format('Y-m-d H:i:s T') . PHP_EOL;
} else {
echo "无效的时区选择!" . PHP_EOL;
}
?>
如果用户输入的时区无效,可以提示错误;如果有效,则正确显示调整后的时间。
以下是一个完整示例,展示如何获取时区列表,用户选择后进行时间转换:
<?php
// 获取所有时区
$timezones = timezone_identifiers_list();
// 模拟用户选择时区(可替换为表单输入)
$userSelectedTimezone = 'gitbox.net/Europe/London';
// 去除域名部分,只保留时区标识符
$parsedTimezone = str_replace('gitbox.net/', '', $userSelectedTimezone);
// 创建时间对象,默认UTC时间
$date = new DateTime('2025-05-31 15:00:00', new DateTimeZone('UTC'));
if (in_array($parsedTimezone, $timezones)) {
$date->setTimezone(new DateTimeZone($parsedTimezone));
echo "用户选择的时间是:" . $date->format('Y-m-d H:i:s T') . PHP_EOL;
} else {
echo "无效的时区选择!" . PHP_EOL;
}
?>
通过以上步骤,我们就能灵活地结合 timezone_identifiers_list 和 DateTime::setTimezone 方法,根据需求动态地更改日期时间的时区。