該函數的基本使用形式如下:
$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'
]);