當前位置: 首頁> 最新文章列表> timezone_transitions_get 中的時間戳格式解析

timezone_transitions_get 中的時間戳格式解析

gitbox 2025-06-03

一、timezone_transitions_get 概述

該函數的基本使用形式如下:

 $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字段,也就是時間戳。


二、時間戳(timestamp)的格式解析

在返回的數據中, 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'
]);