Часовой пояс - это регион на Земле, который имеет единое стандартное время, предусмотренное законом. Он часто представлен идентификатором, таким как "America/Los_Angeles". Не допускайте смещения, например -07: 00, в качестве часового пояса. Часовой пояс намного больше. Пожалуйста, прочитайте всю теги wiki для деталей.

Часовой пояс - это регион на Земле, который имеет единое юридически установленное стандартное время. Поскольку юридические определения зон могут сильно различаться и часто изменяться, для правильного применения правил часовых поясов часто требуется база данных или справочная таблица.

Общая информация о часовых поясах

Почти все часовые пояса на суше имеют юридически определенные границы, которые совпадают с границами страны, предписывающими время или какое-либо его подразделение. Из часовых поясов на суше большинство имеют стандартное временное смещение от всемирного координированного времени (UTC) на целое количество часов (от UTC-12 до UTC + 14), но некоторые смещаются на 30 или 45 минут от ближайшего почасового. смещение.

Помимо наземных часовых поясов, существует 25 морских часовых поясов, все из которых разделены линиями долготы. Большинство (от UTC-11 до UTC + 11) имеют ширину 15 ° по долготе, что составляет один час вращения Земли относительно Солнца, но часовая зона в центральной части Тихого океана разделена на две зоны шириной 7,5 ° (UTC ± 12 ) по 180-му меридиану, часть которого совпадает с Международной линией дат. Многие сухопутные часовые пояса наклонены к западу относительно соответствующих морских часовых поясов.

До 1972 года все часовые пояса определялись как смещение от среднего времени по Гринвичу (GMT), которое было средним солнечным временем на меридиане, проходящем через Королевскую обсерваторию в Гринвиче, Лондон, Великобритания. С 1972 года все официальные службы времени транслируют радиосигналы времени, синхронизированные с UTC, в виде атомного времени, которое включает в себя дополнительные секунды, чтобы сохранить его в пределах 0,9 секунды от прежнего времени по Гринвичу, которое теперь называется UT1. Многие страны сейчас юридически определяют свое стандартное время относительно UTC, хотя некоторые все еще юридически ссылаются на GMT, включая само Соединенное Королевство. UTC, также называемое зулусским временем, используется везде на Земле астрономами и другими людьми, которым необходимо однозначно указать время события.

Первоначально все время на Земле было какое-то местное видимое солнечное время, время на солнечных часах, поэтому у каждого города было свое время. Когда хорошо отрегулированные механические часы стали широко распространенными в начале 19-го века, каждый город начал использовать некоторое местное среднее солнечное время. Первый часовой пояс был создан в 1847 году железными дорогами на острове Великобритания с использованием GMT. Сэндфорд Флеминг из Канады предложил всемирные часовые пояса в 1879 году. Примерно к 1900 году почти все время на Земле было в форме стандартных часовых поясов, только некоторые из которых использовали часовое смещение от GMT. Многие применили время в местной астрономической обсерватории ко всей стране, без каких-либо ссылок на GMT. Прошло много десятилетий, прежде чем все время на Земле было в форме часовых поясов, называемых "стандартным смещением" от GMT/UTC. Непал был последней страной, которая приняла стандартное смещение, слегка сместившись к UTC + 5: 45 в 1986 году. Однако с тех пор многие страны изменили свое стандартное смещение, например, когда Северная Корея перешла с UTC + 9 на UTC + 8: 30 в 2015 году.

Связанное понятие - Летнее время или Летнее время, которое является продвижением (обычно) одного часа, предписанного многими странами между spring и осенью.

Часовой пояс! = Смещение

Часовой пояс не может быть представлен только смещением от UTC. Многие часовые пояса имеют более одного смещения из-за правил летнего времени (так называемое "летнее время"). Даты изменения смещений также являются частью правил для часового пояса, как и любые исторические изменения смещений. Многие программы, библиотеки и веб-службы игнорируют эту важную деталь и ошибочно называют стандарт или текущее смещение "зоной". Это может привести к путанице и неправильному использованию данных. Пожалуйста, используйте правильную терминологию, когда это возможно.

  • Смещение - это просто число, которое представляет, как далеко определенное значение даты/времени впереди или позади UTC.
    • Большинство смещений выражены в целых часах.
    • Но есть многие, которые смещены на 30 минут.
    • И есть несколько с 45-минутным смещением.
  • Часовой пояс содержит гораздо больше:
    • Имя или идентификатор, который можно использовать для идентификации зоны.
    • Одно или несколько смещений от UTC
    • Конкретные даты и время перехода зоны между смещениями.
    • Иногда, отдельное отображаемое имя для конкретного языка, которое может быть представлено пользователю.

Можно определить правильное смещение, учитывая часовой пояс и дату/время. Но нельзя определить правильный часовой пояс, учитывая только смещение.

Сокращения часового пояса

Много раз вы будете видеть часовой пояс, сокращенный с использованием трех или более букв, например, PST для сокращения "Стандартное тихоокеанское время". Однако есть много проблем с сокращениями часовых поясов:

  • Они часто неоднозначны. Например, существует пять различных интерпретаций CST:

    • Центральное стандартное время (Северная Америка)
    • Центральное стандартное время (Австралия)
    • Центральное летнее время (Австралия)
    • Стандартное время Китая
    • Стандартное время Кубы

    Смотрите также список сокращений часовых поясов в Википедии.

  • В лучшем случае они представляют только смещение часового пояса, а не часовой пояс. Например, тихоокеанский часовой пояс США сокращенно PST во время тихоокеанского стандартного времени, но использует PDT в тихоокеанское летнее время.

  • Сокращения, как правило, основаны на английском языке. Иногда существует допустимое сокращение на другом языке, и может быть непонятно, какой использовать.

  • Некоторые часовые пояса могут фактически никогда не использовать сокращение в регионе, где наблюдается часовой пояс.

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

Базы данных часовых поясов

В вычислениях обычно используются две разные базы данных часовых поясов:

База данных часовых поясов Microsoft Windows

  • Пример идентификатора: "Eastern Standard Time"

Вы можете получить список этих часовых поясов любым из этих способов:

  • Проверьте раздел реестра Windows по адресу:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
  • Используйте tzutil.exe/l командной строки tzutil.exe/l, просматривая вторую строку каждого результата.
    (Первая строка - это отображаемое имя.)
  • Вызовите TimeZoneInfo.GetSystemTimeZones из .NET, просмотрев свойство Id результирующих объектов TimeZoneInfo.
  • Вызовите EnumDynamicTimeZoneInformation Win32 EnumDynamicTimeZoneInformation, просматривая поле TimeZoneKeyName результирующих объектов DYNAMIC_TIME_ZONE_INFORMATION.

преимущества

  • Встроенный в операционную систему Windows.
  • Обновления развертываются автоматически через Центр обновления Windows.
  • Легко использовать из Win32 или .NET Framework в Windows.
  • По состоянию на июньское обновление 2016 г. охватывает всюду на Земле, за исключением нескольких исследовательских станций в Антарктике.

Недостатки

  • Поддерживается Microsoft вместо органа стандартизации или сообщества.
  • Зоны имеют тенденцию быть широкими, охватывающими несколько стран и мест, а не уточненными в конкретном узком месте.
  • Данные за прошлые годы обычно не уходят очень далеко в историю и не соответствуют начальному году для данных, которые они имеют для каждого часового пояса.
  • Взаимодействие с платформами сторонних разработчиков может быть болезненным.
  • Обновляется ежемесячно в лучшем случае - что может быть или не быть достаточно частым, чтобы иметь дело с изменениями в короткие сроки
    • Ранее многие изменения были выпущены только как исправления, но в последние годы они были изменены, поэтому все изменения развертываются как регулярные обновления.
  • Идентификаторы и имена вводят в заблуждение и назначаются случайно. Соглашения об именах менялись на протяжении многих лет, и их согласованность невелика. В общем, не полагайтесь на идентификатор часового пояса Windows, чтобы что-то значить. Вместо этого выберите часовой пояс на основе его отображаемого имени.

    Несколько примеров:

    • "Восточное стандартное время" относится как к EST, так и к EDT.
    • "Стандартное время в горах" предназначено для MST/MDT, а "Стандартное время в горах США" - для Аризоны, которое установлено на MST.
    • "Стандартное восточное время США" имеет летнее время, начиная с 2006 года (но не для 2005 или более ранних). Это используется в большинстве Индианы.
    • "Стандартное романское время" - это просто синоним времени Центральной Европы.
    • Стандартное время W. Europe - это идентификатор нескольких стран, которые относятся к центральноевропейскому часовому поясу, а не к западноевропейскому часовому поясу.
    • "Стандартное восточное время AUS" и "Стандартное время Австралии" отличаются только на летнее время.
    • "Стандартное арабское время", "Стандартное арабское время" и "Стандартное арабское время" - это три совершенно разных часовых пояса с похожими названиями.
    • "SA Pacific Standard Time" и "Pacific SA Standard Time" также совершенно разные.
    • "Часовой пояс России 3", "Часовой пояс России 10" и "Часовой пояс России 11" являются допустимыми идентификаторами, но другие часовые пояса России имеют имена вместо цифр.
    • "UTC", "UTC-02", "UTC-08", "UTC-09", "UTC-11" и "UTC + 12" являются действительными идентификаторами, но другие смещения не являются.
  • Как упоминалось выше, часовые пояса Windows также имеют отображаемое имя.
    Например, "(UTC-05:00) Eastern Time (US & Canada)".

    • Эти имена содержат смещение часового пояса, но эти смещения представляют стандартное смещение времени, а не текущее смещение. Это может сбивать с толку, так как указанное смещение может быть не действительным.
    • Отображаемые имена локализуются в соответствии с языковыми настройками операционной системы Windows. При использовании через TimeZoneInfo в .NET локализации не обновляются, чтобы отражать текущую культуру или текущую культуру пользовательского интерфейса. Например, у вас может быть приложение, которое передает данные англоязычному пользователю, но при размещении на японском сервере отображаемые имена часовых поясов будут представлены на японском языке.

База данных часовых поясов IANA/Olson

Также известный как ZoneInfo, TZDB или база данных TZ

  • Пример идентификатора: "America/New_York"

преимущества

  • Широко реализован на Linux, Mac, Java, PHP и многих других платформах.
  • Библиотеки доступны для JavaScript и для Windows/.Net.
  • Изысканные часовые пояса, названные по образцу города.
  • Покрывает всюду на Земле.
  • Содержит исторические данные для изменений часового пояса.
  • Ссылка на многие RFC и другие стандарты.
  • Сообщество поддерживается, недавно поддержанное IANA.
  • Частые обновления, несколько раз в год.
  • Некоторые реализации позволяют легко получать обновления:

Недостатки

  • Большинство реализаций требуют ручного обновления, такого как Noda Time, Joda Time, PHP и другие. (Тем не менее, возможность обновления вручную может считаться преимуществом.)
  • Существует так много зон, что может быть сложно представить пользователям простой раскрывающийся список. Тем не менее, выбор часового пояса на основе карты, такой как этот, может обеспечить хороший пользовательский опыт.

Читайте больше на Википедии.

Карта часовых поясов IANA/Olson

На этой карте показана карта часовых поясов IANA/Olson. Обратите внимание, что во многих странах есть несколько часовых поясов.

TZDB map of the worldПредоставлено: Эрик Мюллер

Роль CLDR

Хранилище данных Unicode Common Locale поддерживает локальные переводы имен часовых поясов IANA/Olson, а также сопоставление между идентификаторами Microsoft Windows и IANA/Olson.

Данные сопоставления доступны во второй таблице на этой странице или в формате xml здесь. Обратите внимание, что обычно для каждой данной зоны Windows существует несколько возможных зон IANA/Olson. Таким образом, можно перевести зону Олсона в одну зону Windows, но в другом направлении у них будет более одного возможного выбора. Также обратите внимание, что хотя каждая зона Windows сопоставлена, не каждая зона IANA/Olson является. Таким образом, всегда можно перейти из зоны Windows в (одну или несколько) зон IANA/Olson, но не обязательно наоборот.

Связанный: Как преобразовать между часовыми поясами Microsoft и часовыми поясами IANA в .NET.

Часовые пояса в стиле POSIX

До принятия баз данных часовых поясов стандартный способ описания часовых поясов определялся спецификацией POSIX, установленной в переменной среды TZ.

Примеры:

  • PST8PDT
  • CET-1CEST,M3.5.0/2,M10.5.0/3
  • GRNLNDST3GRNLNDDT,M10.3.0/00:00:00,M2.4.0/00:00:00

Хотя этот компактный формат позволяет выражать правила часовых поясов без базы данных, у него есть несколько недостатков:

  • Не может выразить более двух переходов в год, поэтому он не может обрабатывать события реального мира, такие как Египет в 2010 году или Марокко в 2012, 2013 и 2014 годах.
  • Содержит только текущие правила часового пояса, поэтому его нельзя использовать для точного преобразования исторических изменений, таких как США до 2007 года.
  • Иногда загадочные и трудно читаемые.

К счастью, большинство сред, которые приняли переменную TZ, теперь позволяют вместо этого передавать идентификатор IANA/Olson. Например, смотрите третий вариант для работы с часовыми поясами в glibc.

У IBM есть хорошая статья о форматах часового пояса POSIX против Олсона здесь. (Это было написано для AIX, но применимо во многих других контекстах.)

Идентификаторы часового пояса Rails

Если вы являетесь разработчиком Ruby on Rails или используете API из приложения, созданного с использованием Rails (например, Twitter), то вы можете встретить идентификаторы часовых поясов в немного другом формате, например:

  • "Eastern Time (US & Canada)" (вместо "America/New_York")
  • "London" (вместо "Europe/London")

Эти идентификаторы определены Rails в классе ActiveSupport :: TimeZone. Исходный код этого класса находится здесь. Они основаны на стандартных часовых поясах IANA/Olson. Rails описывает их как "значимое подмножество из 146 зон", однако не описывает, по каким критериям он определяет зону как "значимую".

Хотя эти конкретные зоны должны нормально работать в приложении Rails, вам может быть сложно использовать их в других контекстах. Например, если вам нужно передать часовой пояс в библиотеку JavaScript или через REST API какой-либо третьей стороне, может быть сложно использовать их в формате Rails. Разработчики Rails должны рассмотреть один из двух подходов:

  • При внешнем представлении идентификатора часового пояса Rails используйте ActiveSupport::TimeZone::MAPPING, которая определяет словарь для стандартных идентификаторов зон IANA/Olson.
  • Используйте Ruby TZinfo Gem вместо ActiveSupport::TimeZone. Он обеспечивает доступ к полной базе данных часовых поясов IANA/Olson и использует стандартные идентификаторы.

Связанный: Как преобразовать из часовых поясов Microsoft в часовые пояса Rails.