Всегда ли полезно хранить время в UTC или это тот случай, когда лучше хранить в местное время?

Как правило, лучше всего хранить время в UTC и, как упоминалось здесь и здесь

Предположим, что есть повторное событие, скажем, время окончания, которое всегда в одно и то же время, скажем, 17:00 независимо от того, включено или выключено летнее время для этого часового пояса. А также есть требование не менять время вручную, когда DST включается или выключается для определенного часового пояса. Также требуется, чтобы всякий раз, когда конечное время запрашивалось любыми другими системами через API (т.е. GetEndTimeByEvent), он всегда отправляет конечное время в формате UTC.

Подход 1: Если принято решение хранить в UTC, он может быть сохранен в таблице базы данных, как показано ниже.

Event UTCEndTime ===================== ABC 07:00:00 MNO 06:00:00 PQR 04:00:00 

Для первого события ABC время окончания в UTC – 07:00, которое, если оно будет преобразовано в UTC по местному времени с 1 июля 2012 года, оно выйдет в 17:00 по местному времени и будет преобразовано 10 октября 2012 года ( дата, когда DST включен для часового пояса), тогда результат будет равен 6 вечера, что не является правильным временем окончания.

Один из возможных способов, который я мог бы думать, – хранить время DST в дополнительном столбце и использовать это время, когда часовой пояс имеет DST ON.

Подход 2: Однако, если он хранится как местное время, например, для события ABC, он всегда будет 17:00 в любую дату, так как нет перехода с UTC на местное время.

 Event LocalEndTime ======================= ABC 17:00:00 MNO 16:00:00 PQR 14:00:00 

И прикладной уровень преобразует местное время в UTC для отправки другим системам через (API GetEndTimeByEvent).

Это хорошая идея сохранить время в UTC в этом случае? Если да, то как получить постоянное местное время?

Похожие вопросы: Есть ли веская причина хранить время не в UTC?

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

Я лично считаю, что главное преимущество в том, что время всегда (в основном) гарантировано быть последовательным . Другими словами, всякий раз, когда изменяется часовой пояс или применяется DST, вы не получаете назад или вперед во времени. Это особенно полезно в файловых системах, журналах и т. Д. Но это необходимо в вашем приложении?

Подумайте о двух вещах. Во-первых, о времени сдвига часов DST. Возможно ли, что ваши события будут происходить между 2:00 и 3:00 (в день смены часов)? Что тогда должно произойти?

Во-вторых, будет ли приложение подвержено действительным изменениям часового пояса? Другими словами, вы собираетесь лететь с ним из Лондона в Варшаву и соответствующим образом изменить часовой пояс своего компьютера? Что должно произойти в этом случае?

Если вы ответили « нет» на оба этих вопроса, то вам лучше по местному времени. Это упростит ваше приложение. Но если вы хотя бы один раз ответили « да» , я думаю, вы должны больше подумать.


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

Вы упомянули об этом, разоблачив время через API. Будет ли приложение запрашивать базу данных по каждому запросу? Если вы храните время внутри UTC, вам нужно либо это сделать, либо иным образом убедиться, что при изменении времени DST / часового пояса время кеширования будет отрегулировано / сокращено.

Будет ли он делать что-либо с самим временем? Как и печать, событие будет происходить через 8 часов или временно приостанавливается? Если да, то UTC, вероятно, будет лучше. Конечно, вам нужно подумать обо всех вышеупомянутых проблемах.

Мне нравится думать так:

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

Позвольте базе данных делать то, что хорошо: хранить время как число – либо эпоху UNIX (количество секунд, прошедших с 1970-01-01), либо временную метку UTC (без информации о часовом поясе или летнем времени). Только заботитесь о том, чтобы представить время понятным для человека способом, когда вы должны. Это означает, что в вашей логике приложений, системе отчетов, консольном приложении или в любом другом месте человек будет просматривать данные.

Следующее не будет применяться для действительно многопользовательского глобального продукта SaaS, поэтому это мнение направлено на простых разработчиков приложений «Линия бизнеса».

Хранение как UTC прекрасно, но есть одно требование, которое вызывает боль, если вы это сделаете: «Можете ли вы написать мне отчет, который показывает мне, сколько из X происходит в день?»

Если вы храните даты в формате UTC, это требование вызовет боль; вам необходимо написать код настройки часового пояса на сервере приложений и в ваших отчетах; Каждый конкретный запрос, который вы выполняете для данных, которые include критерии даты, должен будет учитывать это.

Если приложение соответствует следующим критериям:

  1. Каждый экземпляр основан на одном часовом поясе.
  2. Переходы часового пояса обычно находятся вне рабочего времени, или вы не заботитесь о «продолжительности» вещей до уровня, который будет иметь недостающий час или около того.

Я предлагаю вам хранить дату и время в качестве локального времени, используя библиотеку, которая изолирует вас от проблем с настройками часового пояса сервера (например, Noda.Time в мире .net).

Если ваши межсистемные сообщения используют ISO 8601, и ваша firebase database хранит местное местное время + смещение (например, datetimeoffset в MSSQL или ISODate в Монго, поскольку ISO 8601 захватывает его), и вы используете только DateTimeOffset в .NET или OffsetDateTime в Java или какой-то эквивалент в вашем коде, тогда никаких конверсий не требуется. Вы просто храните его. Все функции сравнения будут работать.

Если вы конвертируете в UTC в свою постоянство, то вы потеряли смещение от точки зрения пользователя. Отображение, когда ваш пользователь подписал документ десять лет назад, теперь является серьезной проблемой. Работа над UTC будет означать поиск правил DST, которые играли в то время на этой территории. Кошмар.

Я считаю, что причина, по которой мы все так привыкли к переходу на UTC настойчивость, состоит в том, что мы никогда не использовали правильные типы данных / типы данных, чтобы мы могли поступать правильно.

Я бы просто сохранил компонент Time только без какой-либо Зоны. Всякий раз, когда API должен его обслуживать, добавьте правильную дату и преобразуйте ее как местное время в UTC для этой даты.

База данных = 17:00 (используйте временную метку без даты, часы в байтах, минуты в байтах, строку)

Retrieve = Дата, где мы хотим событие + База данных 17:00 => Преобразовать это из локального в UTC

Таким образом, вы всегда будете выполнять правильное время в UTC.

Фактически вы не сохраняете определенный момент времени, как предполагают большинство API времени. Используйте интервалы, если ваша firebase database поддерживает его (PostgreSQL), или сохраните ее как целое число, представляющее количество секунд (минут / часов) с полуночи или соответствующее начало расписания (понедельник, первый месяц и т. Д.). В любом случае вы отбросили множество головных болей, беспокоясь о том, как «время» обрабатывается между системами, и добавляет лишь незначительную головную боль от конвертации секунд в другое время на ваш взгляд.

  • Управление календарем, датой и временем java для приложения с несколькими часовыми поясами
  • Установите системный часовой пояс из .NET.
  • Мне нужен список сопоставлений городов для timezones - лучший способ получить его?
  • Как установить часовой пояс по умолчанию в node.js?
  • .NET TimeZoneInfo из часового пояса Олсона
  • Игнорирование часовых поясов в Rails и PostgreSQL
  • Преобразование дат UTC в другие часовые пояса
  • Как получить смещение часовой пояс в GMT (как GMT + 7: 00) с устройства Android?
  • Параметр DateTime с часовым поясом формы PST / CEST / UTC / etc.
  • ORA-01882: область часового пояса не найдена
  • Как конвертировать дату с одного часового пояса в другой часовой пояс
  • Interesting Posts

    Могу ли я создать загрузочный USB-флеш-накопитель Linux с помощью компьютера под управлением Windows?

    Тест JUnit для System.out.println ()

    Примеры случайных строк в области данных

    Создание диаграммы с использованием динамического именованного диапазона в Excel 2010

    Сгенерировать полный SQL-скрипт из EF 5 Первые шаги миграции кода

    отображать Песочные часы, когда приложение занято

    Как отслеживать причину SIGABRT

    Где ошибка CS0433 «Тип« X »уже существует как в A.dll, так и в B.dll?

    Есть ли хороший учебник по сценариям MSBuild?

    Как десериализовать список, используя GSON или другую библиотеку JSON в Java?

    Распределение памяти / освобождение Узкое место?

    В чем разница между упорядоченной и сортированной коллекцией?

    «Ошибка при инициализации VM; Не удалось зарезервировать достаточно места для кучи объектов “, используя -Xmx3G

    Перемещение Rails для столбца изменения

    Есть ли способ поиска текста моей истории просмотров в Firefox?

    Давайте будем гением компьютера.