Как PHP вычисляет исторические часовые пояса?

Часовые пояса, смещения и даты начала и окончания летнего времени (и само летнее время вообще существует) менялись с годами; и различия во всем мире составляют довольно сложную сетку зон и смещений UTC для разных мест.

Делает ли PHP что-нибудь, чтобы вычислить это для исторических дат? Если я укажу дату в 1928 году для определенного часового пояса, рассчитает ли PHP правила смещения для этого места в эту дату в 1928 году?


person Stephen R    schedule 04.09.2019    source источник
comment
Если бы этого не было, то это было бы не правильно. Я сомневаюсь, что можно было бы получить даты и время, если они неверны. Не совсем уверен, что понимаю, что в этом такого сложного. Летнее время обычно представляет собой определенный день в году. Это просто вопрос кодирования в этом правиле.   -  person Andreas    schedule 04.09.2019
comment
github.com/php/php-src/blob/ master/ext/date/php_date.c   -  person Brett Gregson    schedule 04.09.2019
comment
@Andreas Это довольно сложно для мировых и исторических данных: data.iana.org/time -zones/tz-link.html   -  person Stephen R    schedule 04.09.2019
comment
@BrettGregson, похоже, PHP использует данные tzdb, которые я только что связал ...?   -  person Stephen R    schedule 04.09.2019
comment
@StephenR да, похоже, так оно и есть   -  person Brett Gregson    schedule 04.09.2019


Ответы (2)


PHP внутренне сохранил список всех изменений смещения часовых поясов. Метод getTransitions() возвращает численно индексированный массив, содержащий ассоциативный массив со всеми переходами. Вы можете просмотреть этот список следующим образом:

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

Записи на будущее - чистая спекуляция.

person jspit    schedule 04.09.2019

Часовые пояса, смещения и даты начала и окончания летнего времени (и само летнее время вообще существует) менялись с годами; и различия во всем мире составляют довольно сложную сетку зон и смещений UTC для разных мест.

Да, в самом деле. История часовых поясов на Земле - чрезвычайно сложная тема, поскольку каждый часовой пояс определяется отдельным государственным органом. Хотя почти все теперь согласны использовать Всемирное координированное время (UTC) в качестве основы для хронометража, нет такого стандартного соглашения, когда речь идет о местном времени. Таким образом, «часовые пояса» состоят из:

  • Стандартное смещение от UTC
  • Потенциально другое смещение от UTC, которое применяется в другое время года, обычно называемое «летним временем» или «летним временем».
  • Расписание, в котором указаны точные даты и время перехода со стандартного времени на летнее и зимнее время.
  • Города или географические границы, к которым относятся часовые пояса.
  • Изменения любого из вышеперечисленного в любой момент времени
  • История того, как эти правила менялись в прошлом
  • Некоторые обоснованные предположения о том, как эти правила могут остаться или измениться в течение некоторого периода в будущем.

На этот предметный домен распространяется "база данных TZ", также известная как база данных часовых поясов IANA. , база данных часовых поясов Олсона, zoneinfo, tzdata, tzdb и несколько других имен. Он открыто поддерживается сообществом через IANA под управлением управление BDFL, описанное в IETF BCP 175/RFC 6557. Он широко реализован на многих различных платформах и языках программирования.

Делает ли PHP что-нибудь, чтобы вычислить это для исторических дат?

PHP реализует базу данных TZ через пакет PECL "timezonedb". Каждая версия PHP распространяется с уже включенной последней версией timezonedb. Его также можно обновить независимо, но часто проще просто обновиться до последней версии PHP.

Вы можете прочитать все об этом в документации PHP Date and Time.

Если я укажу дату в 1928 году для определенного часового пояса, рассчитает ли PHP правила смещения для этого места в эту дату в 1928 году?

Это зависит от того, о каком часовом поясе вы спрашиваете. В целом, ДА. Однако база данных TZ гарантирует данные только с 1970 года. Однако во многих часовых поясах доступны данные о предыдущих часовых поясах, если они известны.

Политика TZDB в этом отношении заключается в том, что они создают записи часовых поясов только для тех зон, где часы имеют уникальные правила после 1970 года, даже если они отличались до этого. Для зон, которые соответствуют этому критерию, они дополняются информацией по мере ее появления. В списке рассылки TZ часто обсуждаются исторические сведения о часовых поясах. предоставляется разумный источник, затем часто он корректируется в базе данных TZ.

Например, в зоне TZDB "America/Chicago" есть данные с 1883 года. Однако он также охватывает весь центральный часовой пояс США, от которого до 1970 года были отклонения для других городов, которые не включены в TZDB.

В качестве контрпримера можно привести зону TZDB "Asia/Thimphu", представляющую Бутан. данные часового пояса с 1947 года. Если вы запросите дату в 1928 году, будет использоваться местное среднее время (LMT ) вместо этого. Некоторых это может сбить с толку, поскольку LMT рассчитывается на основе широты и долготы, а не определяется правительством. В этом случае Asia/Thimphu имеет смещение LMT UTC+05:56:36, тогда как после 1947 года было известно, что оно имеет смещение UTC+05:30, до 1987 года, когда оно стало UTC+06:00.

person Matt Johnson-Pint    schedule 04.09.2019