Подтвердить что ты не робот

Разница между часовыми поясами America/Los_Angeles и US/Pacific и PST8PDT?

Мне нужно преобразовать кучу дат в базе данных MySQL из тихоокеанского времени (America/Los_Angeles) в UTC. Я нашел отличный ответ SO о том, как это сделать.

Во время моих тестов и подготовки я обнаружил, что получаю одинаковые конверсии при использовании любого из следующих имен часовых поясов:

  • Америка /Los _Angeles
  • США /Pacific
  • PST8PDT

Итак, мои вопросы таковы:

  • Все ли это просто псевдонимы к одному и тому же? Или существуют определенные различия между ними в определенный момент времени?
  • Если я хочу предоставить список часовых поясов пользователям на веб-сайте, было бы лучше дать им выбор из группы имен America или группы имен US?
4b9b3361

Ответ 1

US/Pacific и PST8PDT оба относятся к "другим" часовым поясам, которые поставляются с этим предупреждением:

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

Все они должны ссылаться на один и тот же часовой пояс, сравните:

http://www.travelmath.com/time-zone/PST8PDT
http://www.travelmath.com/time-zone/US/Pacific
http://www.travelmath.com/time-zone/America/Los_Angeles

Как таковой, вы должны использовать America/Los_Angeles, который, кстати, также должен быть довольно "естественным" и простым выбором для пользователей.

Ответ 2

US/Pacific - это ссылка на America/Los_Angeles в базе данных IANA (см. wikipedia). В системах Linux, которые я видел, первый - это жесткий файл с привязкой к последнему; на OS X это может быть копия. Если вы запустили контрольную сумму (например, md5 или sha1) для записей в /usr/share/zoneinfo/, то они должны совпадать.

Однако PST8PDT может быть другим - я не понял точно, как это сделать. Этот отчет об ошибках указывает, что он не отслеживает историю изменений, связанных с дневным освещением, то есть он просто ретроактивно применяет текущие правила летнего времени к прошлому; но это не похоже на этот пример Ruby. Если бы это было ретроактивно, применяя текущие правила, то оба были бы -0700:

> ENV['TZ']='PST8PDT'
> [Time.mktime(2006, 4, 2, 1, 59, 59), Time.mktime(2006, 4, 2, 2)]
=> [2006-04-02 01:59:59 -0800, 2006-04-02 03:00:00 -0700] 

В это сообщение есть цитата из оригинального сопровождающего базы данных. Автор сообщения объясняет, что унаследованные зоны, включая PST8PDT, использовали устаревшую информацию, но теперь они "менее ошибочны", что бы это ни значило.

Подводя итог, не используйте PST8PDT, но безопасно использовать либо US/Pacific, либо America/Los_Angeles.

Ответ 3

Я столкнулся с проблемой с параллельными US/Eastern, Americas/New_York и EST5EDT. Вот что я обнаружил.

Для дат после того, как в 1967 году вступил в силу Закон о единообразном времени 1966 года, эти временные интервалы идентичны. Кроме того, США применяли стандартные правила DST во время мировых войн, поэтому все они идентичны 1918-1919 и 1942-1945 гг.

Для любой даты до 1918 года, между 1920 и 1941 годами включительно, а между 1946 и 1966 годами включительно, EST5EDT всегда будет идентичным EST. PST5PDT всегда будет идентичен PST.

До 1967 года Americas/New_York обеспечит время , как наблюдалось в Нью-Йорке. Таким образом, переход на летнее время будет следовать правилам муниципалитета штата Нью-Йорк или штата Нью-Йорк. Любая дата до 1883 года 18 ноября 12:03:58 будет находиться в местном среднем времени со смещением -4: 56: 02 от UTC. Для Americas/Los_Angeles в любое время до 1883 18 ноября 12:07:02 будет местное среднее время со смещением -7: 52: 58 от UTC. Между 1883 и 1967 года Лос-Анджелес следует за правилами Лос-Анджелеса и Калифорнийского летнего времени.

Нечетные вещи могут произойти, если у вас есть несколько систем, где предполагается PST8PDT, а другое принимает Americas/Los_Angeles. Данные могут выглядеть хорошо для всего, что было недавно. Дата рождения, например, с лета 1966 года, может быть перемещена в час, а затем усечена, поэтому, похоже, она была в предыдущий день.

И только для дополнительной забавы, если вы имеете дело со старыми датами на Аляске, вам нужно помнить, что Аляска была куплена из России. Даты до 1867 года 18 октября на другой стороне международной линии дат и используют юлианский, а не григорианский календарь. Так Джуно, например, пошел с 6 октября 1867 года (Джулиан) +15: 02: 19-18 октября 1867 года (по-григориански) -8: 57: 41.