Часовые пояса `Etc / GMT`, почему наоборот? - PullRequest
0 голосов
/ 31 октября 2018

Часовые пояса в php работают следующим образом https://www.gsp.com/support/virtual/admin/unix/tz/gmt/

и когда он назвал Etc/GMT+11 это на самом деле GMT-11

и когда он назвал Etc/GMT-11, то на самом деле GMT+11

Почему? И что это значит Etc/GMT?

Я нахожу это в PHP, это ошибка в PHP или это везде?

1 Ответ

0 голосов
/ 31 октября 2018

Это не ошибка. Идентификаторы базы данных tz в форме Etc/GMT±* намеренно имеют инвертированный знак, чем обычные формы, которые мы ожидаем согласно ISO 8601. То есть они имеют положительные значения к западу от GMT, а не положительные значения к востоку от GMT.

Причина заключается в обратной совместимости с идентификаторами часовых поясов в стиле POSIX, которые используются с первым форматом TZ переменной среды . Когда POSIX-совместимые системы интерпретируют эту переменную, значения, такие как America/Los_Angeles, явно переходят в третий формат (описанный в том же документе), но значения, такие как Etc/GMT+11, неоднозначны в отношении того, какие правила формата должны применяться. Таким образом, для соответствия идентификаторам зон их знаки должны быть инвертированы.

Из базы данных tz, в которой определены эти зоны :

# Be consistent with POSIX TZ settings in the Zone names,
# even though this is the opposite of what many people expect.
# POSIX has positive signs west of Greenwich, but many people expect
# positive signs east of Greenwich.  For example, TZ='Etc/GMT+4' uses
# the abbreviation "-04" and corresponds to 4 hours behind UT
# (i.e. west of Greenwich) even though many people would expect it to
# mean 4 hours ahead of UT (i.e. east of Greenwich).

Это также обсуждается в статье Википедии о базе данных tz .

Что касается практических вопросов, комментарий к базе данных tz также гласит:

# These entries are mostly present for historical reasons, so that
# people in areas not otherwise covered by the tz files could "zic -l"
# to a time zone that was right for their area.  These days, the
# tz files cover almost all the inhabited world, and the only practical
# need now for the entries that are not on UTC are for ships at sea
# that cannot use POSIX TZ settings.

Так что, если вы не держите время для кораблей в море, я настоятельно рекомендую вместо этого использовать идентификатор на основе местности. (возможно Australia/Melbourne?)

Кроме того, лучшим источником идентификаторов часовых поясов будет тот, что в Википедии .

Поскольку вы сказали, что используете PHP, обратите внимание, что в документации PHP также есть список , и на странице "Others" это фактически объясняет это также:

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

Внимание Если вы игнорируете вышеупомянутое предупреждение, обратите также внимание, что база данных часовых поясов IANA, которая обеспечивает поддержку часовых поясов PHP, использует знаки стиля POSIX, в результате чего часовые пояса Etc / GMT + n и Etc / GMT-n инвертируются из общего использования.

Например, часовой пояс на 8 часов вперед по Гринвичу, который используется в Китае и Западной Австралии (среди других мест), фактически равен Etc / GMT-8 в этой базе данных, а не Etc / GMT + 8, как вы обычно ожидаете.

Еще раз, настоятельно рекомендуется использовать правильный часовой пояс для вашего местоположения, такой как Азия / Шанхай или Австралия / Перт для приведенных выше примеров.

...