PHP 8.2 中 DateTimeZone 类不提供统一的详细信息接口,需组合 getName() 获取时区标识、getOffset() 获取指定时间点 UTC 偏移及夏令时状态、getTransitions() 获取历史变更记录。

PHP 8.2 中,DateTimeZone 类本身不直接提供“详细信息”(如 UTC 偏移、夏令时规则、地区描述等)的完整接口,但可通过组合使用其方法与 DateTime 实例,获取当前或指定时间点下的真实时区行为。关键在于:**时区信息是动态的、依赖具体时间点的**,不能脱离时间谈“当前偏移”或“是否夏令时”。
获取时区名称和基本标识
构造 DateTimeZone 对象后,可用 getName() 获取标准时区标识符(如 "Asia/Shanghai" 或 "Europe/London"),这是唯一可靠且可持久化的时区表示方式。
$tz = new DateTimeZone('America/New_York');echo $tz->getName(); // 输出 "America/New_York"
获取指定时间点的 UTC 偏移和夏令时状态
调用 getOffset(DateTimeInterface $datetime) 可返回该时刻相对于 UTC 的秒数偏移(含夏令时影响)。必须传入一个具体的 DateTime 实例,因为偏移可能随年份变化。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
$tz = new DateTimeZone('Europe/Berlin');$dt = new DateTime('2024-07-01', $tz); // 夏令时期间echo $tz->getOffset($dt); // 输出 7200(即 +02:00)$dt2 = new DateTime('2024-01-01', $tz); // 标准时间echo $tz->getOffset($dt2); // 输出 3600(即 +01:00)
获取时区转换历史(过渡信息)
使用 getTransitions(int $timestampBegin = PHP_INT_MIN, int $timestampEnd = PHP_INT_MAX) 可获取指定时间范围内所有 UTC 偏移变更记录(如夏令时起止、政策调整)。每条记录包含 ts(UTC 时间戳)、time(本地时间字符串)、offset(秒偏移)、isdst(是否夏令时)、abbr(缩写,如 CEST/CET)等字段。
立即学习“PHP免费学习笔记(深入)”;
$tz = new DateTimeZone('Australia/Sydney');$transitions = $tz->getTransitions(strtotime('2023-01-01'), strtotime('2025-01-01'));foreach ($transitions as $t) {-
printf("%s → %s (UTC%+d) %s\n", date('Y-m-d', $t['ts']), $t['abbr'], $t['offset']/3600, $t['isdst'] ? '(DST)' : '(STD)'); }
注意:没有“通用时区详情”API
PHP 不提供类似 getTimezoneInfo() 这样的单次调用返回全部元数据的方法。所谓“详细信息”需按需组合:getName() 得标识,getOffset() 得当前偏移,getTransitions() 得历史变更。避免用 date_default_timezone_get() 或 ini_get('date.timezone') 替代具体时区对象——它们只反映默认设置,不具时区上下文。


















