当前位置: 首页> 最新文章列表> 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'
]);