PHP 如何计算历史时区?

How does PHP calculate historic time zones?

DST 的时区、偏移量和开始结束日期(以及 DST 本身存在的日期)这些年来已经发生了变化;世界范围内的差异构成了一个相当复杂的区域网格和不同位置的 UTC 偏移量。

PHP 会针对历史日期进行任何计算吗?如果我为特定时区输入 1928 年的日期,PHP 会计算该位置在 1928 年该日期的偏移规则吗?

PHP 已在内部存储了所有时区偏移更改的列表。 getTransitions () 方法 returns 一个数字索引数组,包含一个具有所有转换的关联数组。 您可以这样查看此列表:

$timeZoneChicago = new DateTimeZone('America/Chicago');
$transArray = $timeZoneChicago->getTransitions();
echo "<pre>".var_export($transArray,true)."</pre>";

未来的条目纯属猜测。

Time zones, offsets, and start end dates for DST (and DST itself existing at all) have changed over the years; and the differences worldwide make up a quite complex grid of zones and UTC offsets for different locations.

确实如此。地球上时区的历史是一个极其复杂的课题,因为每个时区都是由一个单独的政府实体划定的。虽然现在几乎每个人都同意使用 Coordinated Universal Time (UTC) 作为计时的基础,但在当地时间方面并没有这样的标准化协议。因此,“时区”包括:

  • 与 UTC 的标准偏移量
  • 可能与 UTC 的另一个偏移量适用于一年中的不同时间,通常称为“夏令时”或“夏令时”
  • 包含在标准时间和夏令时之间转换的确切日期和时间的时间表
  • 时区适用的城市或地理边界
  • 在任何时间点对上述任何一项的更改
  • 过去这些规则的变化历史
  • 一些合理的猜测关于这些规则在未来一段时间内可能如何保留或改变

此主题域包含在 "TZ Database", also known as the IANA time zone database, Olson time zone database, zoneinfo, tzdata, tzdb, and a few other names. It is maintained openly by community via IANA, ruled by BDFL governance described in IETF BCP 175 / RFC 6557 中。它广泛应用于许多不同的平台和编程语言。

Does PHP do anything to calculate this for historic dates?

PHP 通过 PECL "timezonedb" package 实现 TZ 数据库。 PHP 的每个版本都包含最新版本的 timezonedb。它也可以独立更新,但更新到最新的 PHP 版本通常更容易。

您可以在 the PHP Date and Time documentation 中阅读所有相关信息。

If I put in a date in 1928 for a particular time zone, does PHP calculate what the offset rules were for that location, on that date, in 1928?

这取决于您询问的时区。 一般来说,。但是,TZ 数据库只保证 1970 年以后的数据。但是,有许多时区可以使用先前的时区数据 - 如果已知。

TZDB 对此的政策是,他们只为时钟在 1970 年后具有独特规则的区域创建时区条目 - 即使它们在此之前有所不同。对于 do 满足此条件的区域,它们会在已知信息后回填。 TZ Mailing List 上经常有关于历史时区信息的讨论,如果提供了合理的来源,那么通常会在 TZ 数据库中进行更正。

例如,TZDB 时区 "America/Chicago" 拥有自 1883 年以来的数据。然而,它也包含整个美国中部时区,其他城市在 1970 年之前存在偏差,即 在 TZDB 中捕获。

作为反例,TZDB 区域 "Asia/Thimphu" representing Bhutan only has time zone data since 1947. If you ask for a date in 1928, it will use the Local Mean Time (LMT) 条目代替。这可能会让一些人感到困惑,因为 LMT 是根据纬度和经度计算的,而不是由政府决定的。在这种情况下,Asia/Thimphu 具有 UTC+05:56:36 的 LMT 偏移量,而在 1947 年之后,已知具有 UTC+05:30 偏移量,直到 1987 年才变为 UTC+06:00。