该函数的基本使用形式如下:
$tz = new DateTimeZone('America/New_York');
$transitions = timezone_transitions_get($tz);
或者简写为:
$transitions = (new DateTimeZone('America/New_York'))->getTransitions();
返回的 $transitions 是一个数组,每一个元素都是一个包含以下字段的关联数组:
ts: 时间戳(integer)
time: ISO 格式时间(字符串)
offset: 偏移量(相对于 UTC 的秒数)
isdst: 是否是夏令时(布尔值)
abbr: 当前时间缩写(如 EDT 或 EST)
我们本文重点关注的就是 ts 字段,也就是时间戳。
在返回的数据中,ts 表示自 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来的秒数。它是一个整数,可正可负。
比如我们通过以下代码获取并打印转换时间点:
$tz = new DateTimeZone('Europe/Paris');
$transitions = $tz->getTransitions();
foreach ($transitions as $transition) {
echo "时间戳:{$transition['ts']},对应时间:{$transition['time']}\n";
}
输出结果可能类似:
时间戳:-1830384000,对应时间:1916-06-14T23:00:00+0000
时间戳:-1689814800,对应时间:1916-10-01T23:00:00+0000
...
可以看到,时间戳是以整数形式表示的时间点,负值代表的是 1970 年之前的时间。
你可以使用 DateTime 类来处理这个转换:
$timestamp = $transition['ts'];
$dt = (new DateTime())->setTimestamp($timestamp);
echo $dt->format('Y-m-d H:i:s');
值得注意的是:默认创建的 DateTime 对象是在当前时区下,你也可以手动设定:
$tz = new DateTimeZone('UTC');
$dt = new DateTime("@{$timestamp}");
$dt->setTimezone($tz);
echo $dt->format('Y-m-d H:i:s T');
我们可以从 getTransitions() 返回的列表中筛选出最近一次转换,用于显示当前偏移量与夏令时信息:
$tz = new DateTimeZone('Asia/Shanghai');
$transitions = $tz->getTransitions();
$now = time();
$recent = null;
foreach ($transitions as $transition) {
if ($transition['ts'] <= $now) {
$recent = $transition;
} else {
break;
}
}
echo "最近的转换时间为:{$recent['time']},UTC 偏移量为:{$recent['offset']} 秒";
如果你打算以 Web API 形式返回这些信息,你可以使用如下结构输出 JSON:
header('Content-Type: application/json');
echo json_encode([
'timestamp' => $recent['ts'],
'utc_time' => $recent['time'],
'offset' => $recent['offset'],
'isdst' => $recent['isdst'],
'abbr' => $recent['abbr'],
'source' => 'https://gitbox.net/timezone/transition'
]);