ISO 8601 с переходом на летнее время

Мой API показывает время клиентам, используя ISO 8601. У нас есть функция, в которой мы хотим отображать, из какого часового пояса она была. Просто сохраняя смещение часового пояса, мы теряем эту деталь.

то есть, Юта и Аризона соблюдают MST -06:00 в течение половины года, а Юта переходит на MDT -07:00 в течение второй половины. Наше текущее решение - определить, была ли дата во время летнего времени, и использовать *DT часовые пояса во время и *ST в противном случае, но даты ISO 8601 из Аризоны приведут к тихоокеанскому летнему времени.

Есть ли способ указать, наблюдается ли переход на летнее время в формате ISO 8601? Вроде 2016-01-11T13:00:04Z DST0 или что-то подобное?


person bradynpoulsen    schedule 11.01.2016    source источник
comment
msdn.microsoft.com/en-us/library /bb384267(v=vs.110).aspx: во-первых, значения даты и времени не связаны тесно с часовыми поясами, к которым они принадлежат. В результате, если ваше приложение не предоставляет какой-либо механизм для связывания даты и времени с соответствующим часовым поясом, для конкретного значения даты и времени легко отделяться от своего часового пояса. - Значит, вам придется реализовать это самостоятельно или использовать библиотеку.   -  person Caramiriel    schedule 12.01.2016
comment
Если вы используете Z, вы указываете время в формате UTC, поэтому конвертируйте в зависимости от даты. Если вы хотите знать, какой часовой пояс был у пользователя при вставке этой даты, я думаю, вам нужно перейти в другое поле.   -  person Jcl    schedule 12.01.2016


Ответы (4)


ISO 8601 довольно плавно (и вводит в заблуждение) скользит между терминами «часовой пояс» и «смещение по всемирному координированному времени».

Для ссылки на глобально уникальный момент представление типа «Thh: mm: ssZ + 01: 00» отлично работает в том смысле, что:

  • обозначает уникальную точку на шкале UTC,
  • не зависит, находится ли отправитель в Z + 01 или в Z + 00 во время перехода на летнее время.

Если вы хотите передать в дополнение местонахождение отправителя, тогда подходящее поле местоположения может быть добавлено вне структуры 8601. Нет необходимости указывать местоположение в поле времени.

Лично я бы хотел, чтобы "часовой пояс" был исключен из ISO 8601.

person Paul White    schedule 12.09.2019

Похоже, что новая редакция ISO 8601: 2004 находится в стадии подготовки и разделена на две части: ISO 8601-1: 201x (соответствует текущему стандарту) и ISO 8601-2: 201x (новый раздел, касающийся с различными расширениями базового стандарта, такими как неопределенное или неопределенное время, или годы с более чем 4 цифрами и т. д.). При поиске в Google "iso 8601 pdf" появляется Проект ISO 8601-1 и Проект ISO 8601-2. Поскольку они датируются 2016 годом, но интернет-магазин ANSI по-прежнему предоставляет ISO 8601: 2004 (за плату), они еще не являются стандартом - стандартом остается ISO 8601: 2004.

Ни стандарт, ни черновики не допускают ничего, кроме числового смещения часового пояса от UTC (±1030 или ±10:30, для вымышленного примера) или Z (обозначающего UTC, также известного как зулусское время - потому что буква Z называется зулусской в ​​фонетический алфавит НАТО).

Следовательно, в ISO 8601 нет прямых указаний.

Часовые пояса - предмет постоянных споров, и в них нет ничего простого. Например, в феврале 2018 года в штате Флорида был принят закон, согласно которому в течение всего года будет действовать «летнее время»; Будет ли это разрешено, еще неизвестно. IANA размещает (но не управляет напрямую) базу данных часовых поясов Olson (названную в честь ее первоначального создателя А. Д. Олсона). Вы можете найти информацию о TZDB по адресу https://www.iana.org/time-zones. Текущая версия базы данных доступна для загрузки, и есть два списка рассылки, один для объявлений (несколько раз в год) и один для текущих обсуждений (в большинстве дней, часто несколько сообщений в день). Консорциум Unicode также имеет CLDR (Common Locale Data Repository), который также попутно обрабатывает имена часовых поясов (он также имеет дело со многими другими аспектами локали, и это его основная цель, а не часовые пояса).

Даже в Аризоне все не так просто. Большая часть Аризоны не использует летнее время (переход на летнее время), но нация навахо действительно использует летнее время, за исключением того, что территория нации навахо для нации хопи не использует летнее время. Даже геолокация точки, где применяется время, может не помочь. Есть города, в которых два разных населения используют разные смещения часовых поясов от всемирного координированного времени, хотя для этих двух смещений нет отдельной области. Вы в значительной степени должны знать, какой часовой пояс следует рассматривать для применения к значению даты / времени, которое вы записываете, и не существует 100% надежного способа узнать это. (Предположим, кто-то из Калифорнии путешествует по Европе и назначает встречу с членами команды в Нью-Йорке, Лондоне, Риме, Сиднее и Калькутте - какой часовой пояс применяется к встрече?)

person Jonathan Leffler    schedule 22.03.2018
comment
Вы можете найти интересный материал на UTC достаточно для всех, верно? и, возможно, на Будущее UTC. - person Jonathan Leffler; 29.06.2018

Я не мог найти способ сделать это хорошо, используя ISO8601 или RFC2822. Я храню время в базе данных MySql - время, которое в этой статье называется «TV Time» https://stackoverflow.com/tags/timezone/info. Время ТВ отличается от времени по Гринвичу при переходе на летнее время по сравнению с тем, когда время не переходят на летнее время, но мои пользователи называют это время одним и тем же временем. EG: «Я начинаю работу в 9 утра», а не «Я начинаю работу в 22:00 по московскому времени летом и в 21:00 по московскому времени зимой».

Мое решение заключалось в том, чтобы добавить в базу данных дополнительный строковый столбец (я назвал его «tzid») и сохранить текст tzid из этого списка https://unicode.org/cldr/charts/latest/supplemental/zone_tzid.html (а в PHP DateTimeZone :: listAbbreviations () также дает список). Дата и время хранятся в столбце MySQL DateTime.

Большую часть времени я передаю своему приложению «Время ТВ» из столбца datetime, и оно просто отображается без последствий. Если мне когда-нибудь понадобится сравнить время в разных часовых поясах или определить интервалы, я могу преобразовать в UTC, используя столбец tzid.

person NULL pointer    schedule 22.03.2018

Я знаю, что это устаревает, надеюсь, что нижеприведенное, по крайней мере, подстегнет разговоры и идеи.

Итак, в основе этого вопроса, на мой взгляд, лежит проблема с ISO 8601, он не может нести необходимую информацию, чтобы помочь в переходе на летнее время.

Некоторое время назад я столкнулся с подобной проблемой и провел много «конструктивных» бесед с коллегами о том, как лучше всего решить проблему даты, записанной внутри летнего времени, но просматриваемой из часового пояса без перехода на летнее время ... мы всегда продолжали возвращаться к ISO 8601 будучи властелином, всемогущим в решении проблемы переноса даты и времени, но он так и не решил проблему перехода на летнее время.

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

Это было не то место, где я хотел это оставить ... на самом деле я был одним из немногих в обсуждениях, которые продолжали ковырять дыры в часовых поясах в ISO 8601, когда другие были убеждены, что смещения достаточно. Точно так же, как вы обнаружили, он не позволяет учитывать часовой пояс или точное преобразование в другие часовые пояса, и поэтому я счел ISO 8601 недопустимыми датой и временем с транспортным форматом часового пояса.

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

Эта страница содержит подробную информацию о формате, а также несколько глупых шуток о планетарной поддержке часовых поясов. https://github.com/Gitapedia/AltSO-8601

У меня также есть расширенный класс Carbon PHP, который поддерживает синтаксический анализ и преобразование формата Altso 8601. https://packagist.org/packages/mossengine/alteredcarbon Этот пакет было бы лучше плагин к пакету Carbon, но расширенного класса было достаточно, чтобы хотя бы продемонстрировать концепцию.

Похоже, что можно было бы поработать над улучшением формата ISO 8601 с пересмотром, но я не могу ждать так долго и чувствую, что смещение бесполезно и может быть заменено часовым поясом, и зачем нам нужны все двоеточия, тире, Ts и Zs, когда мы можем просто объединить дату и время вместе, и они все еще читабельны и меньше, чтобы учесть дополнительные байты, необходимые для предоставления часового пояса.

Следующим шагом будет рассмотрение (если таковая существует) поддержки часовых поясов коротких имен или их изобретение, чтобы формат Altso 8601 мог передавать меньшие объемы данных с более глубоким пониманием даты и времени (особенно часового пояса).

person Brendon Moss    schedule 27.12.2018