Всякий раз, когда вы говорите о точном моменте времени, сохраняйте время в соответствии с единым стандартом, который не зависит от перехода на летнее время. (GMT и UTC эквивалентны в этом отношении, но предпочтительнее использовать термин UTC. Обратите внимание, что UTC также называется Zulu или Z time.)
Если вместо этого вы выберете сохранение времени с использованием значения местного времени, включите смещение по местному времени от UTC, чтобы метка времени впоследствии могла быть однозначно интерпретирована.
В некоторых случаях вам может потребоваться сохранить время UTC и эквивалентное местное время. Часто это делается с двумя отдельными полями, но некоторые платформы поддерживают тип datetimeoffset, который может хранить оба в одном поле.
При сохранении меток времени в виде числового значения используйте время Unix - это количество целых секунд с 1970-01-01T00: 00: 00Z (исключая високосные секунды). Если вам требуется более высокая точность, используйте вместо этого миллисекунды. Это значение всегда должно основываться на UTC, без каких-либо настроек часового пояса.
Если вам позже потребуется изменить метку времени, включите исходный идентификатор часового пояса, чтобы вы могли определить, могло ли смещение измениться по сравнению с записанным исходным значением.
При планировании будущих событий обычно предпочтительнее местное время, а не UTC, поскольку смещение обычно меняется. Смотрите ответ и сообщение в блоге.
Помните, что смещения часовых поясов не всегда являются целым числом часов (например, индийское стандартное время - UTC + 05: 30, а Непал использует UTC + 05: 45).
Если используется Java, используйте java.time для Java 8 или Joda Time для Java 7 или ниже.
Если вы используете .NET, рассмотрите возможность использования Noda Time.
Если вы используете .NET без Noda Time, учтите, что DateTimeOffset часто является лучшим выбором, чем DateTime.
Если вы используете Perl, используйте DateTime.
Если вы используете Python, используйте pytz или dateutil.
Если вы используете JavaScript, используйте moment.js с расширением moment-timezone.
Если используется PHP> 5.2, используйте собственные преобразования часовых поясов, предоставляемые классами DateTime и DateTimeZone. Будьте осторожны при использовании.
DateTimeZone :: listAbbreviations () - см. Ответ. Чтобы поддерживать PHP в актуальном состоянии, данные Olson следует периодически устанавливать PECL-пакет timezonedb; см. ответ.
Если вы используете C ++, обязательно используйте библиотеку, которая правильно использует базу данных часовых поясов IANA. К ним относятся cctz, ICU и библиотека tz Говарда Хиннанта.
Не используйте Boost для преобразования часовых поясов. Хотя его API утверждает, что поддерживает стандартные идентификаторы IANA (он же «zoneinfo»), он грубо сопоставляет их с фиксированными смещениями без учета богатой истории изменений, которые могла иметь каждая зона.
(Также файл вышел из строя.)
В большинстве бизнес-правил используется гражданское время, а не UTC или GMT. Поэтому планируйте преобразовывать временные метки UTC в местный часовой пояс перед применением логики приложения.
Помните, что часовые пояса и смещения не являются фиксированными и могут изменяться. Например, исторически США и Великобритания использовали одни и те же даты, чтобы «прыгнуть вперед» и «отступить».
Тем не менее, в 2007 году США изменили даты, на которые меняются часы. Теперь это означает, что в течение 48 недель в году разница между лондонским и нью-йоркским временем составляет 5 часов, а в течение 4 недель (3 весной, 1 осенью) - 4 часа. Обращайте внимание на подобные элементы в любых расчетах, которые включают несколько зон.
Рассмотрите тип времени (фактическое время события, время вещания, относительное время, историческое время, повторяющееся время), какие элементы (временная метка, смещение часового пояса и имя часового пояса) вам нужно сохранить для правильного поиска - см. «Типы Время "в ответе.
Синхронизируйте файлы tzdata вашей ОС, базы данных и приложений между собой и остальным миром.
На серверах установите аппаратные часы и часы ОС на UTC, а не на местный часовой пояс.
Независимо от предыдущего пункта, серверный код, включая веб-сайты, никогда не должен ожидать, что локальный часовой пояс сервера будет чем-то конкретным.см. ответ.
Использование служб NTP на всех серверах.
При использовании FAT32 помните, что временные метки хранятся по местному времени, а не по UTC.
При работе с повторяющимися событиями (например, еженедельным телешоу) помните, что время меняется с переходом на летнее время и будет различаться по часовым поясам.
Всегда запрашивать значения даты и времени как включающие нижнюю границу, верхнюю границуисключительный (> =, <). </p>