Я не уверен, что я могу добавить к ответам выше, но вот несколько моментов от меня:
Типы времени
Есть четыре разных момента, которые вы должны рассмотреть:
- Время события: например, время, когда происходит международное спортивное событие, или коронация / смерть / и т.д. Это зависит от часового пояса события, а не от зрителя.
- Телевизионное время: например, конкретное телевизионное шоу транслируется в 21:00 по местному времени по всему миру. Важно подумать о публикации результатов (скажем, American Idol) на вашем сайте
- Относительное время: например: этот вопрос закрывается за 21 час. Это легко отобразить
- Время повторения: например: ТВ-шоу каждый понедельник в 21:00, даже если меняется летнее время.
Существует также историческое / альтернативное время. Это раздражает, потому что они не могут вернуться к стандартному времени. Например: Юлианские даты, даты в соответствии с лунным календарем на Сатурне, клингонским календарем.
Хранение времени начала / окончания в UTC работает хорошо. Для 1 вам нужно имя часового пояса события + смещение, сохраненное вместе с событием. Для 2 вам нужен локальный идентификатор времени, сохраненный для каждого региона, и имя локального часового пояса + смещение, сохраненное для каждого зрителя (это можно получить из IP, если вы находитесь в затруднительном положении). Для 3 храните в секундах UTC и нет необходимости в часовых поясах. 4 - это особый случай 1 или 2, в зависимости от того, является ли это глобальным или локальным событием, но вам также необходимо сохранить созданное с отметкой времени, чтобы вы могли определить, изменилось ли определение часового пояса до или после создания этого события. Это необходимо, если вам нужно показать исторические данные.
Время хранения
- Всегда хранить время в UTC
- Преобразование в местное время на дисплее (локально определяется пользователем, смотрящим на данные)
- При сохранении часового пояса вам необходимо указать имя, временную метку и смещение. Это необходимо, потому что правительства иногда меняют значения своих часовых поясов (например, правительство США изменило даты перехода на летнее время), и ваше приложение должно обрабатывать вещи изящно ... например: точная временная метка, когда эпизоды LOST показывали как до, так и после правил перехода на летнее время изменилось.
Смещения и имена
Примером вышеупомянутого будет:
Финал кубка мира по футболу состоялся в Южной Африке (UTC + 2 - SAST) 11 июля 2010 года в 19:00 UTC.
С помощью этой информации мы можем исторически определить точное время, когда проходил финал WCS 2010 года, даже если определение часового пояса Южной Африки изменилось, и иметь возможность отображать его зрителям в их местном часовом поясе в тот момент, когда они запрашивают базу данных.
Системное время
Вам также необходимо поддерживать синхронизацию файлов tzdata вашей ОС, базы данных и приложений как между собой, так и с остальным миром, а также проводить тщательные испытания при обновлении. Не случайно, что стороннее приложение, от которого вы зависите, неправильно обрабатывает изменения TZ.
Убедитесь, что аппаратные часы установлены на UTC, и если вы используете серверы по всему миру, убедитесь, что их операционные системы также настроены на использование UTC. Это становится очевидным, когда вам нужно скопировать почасово повернутые файлы журнала apache с серверов в нескольких часовых поясах. Сортировка их по имени файла работает, только если все файлы имеют одинаковый часовой пояс. Это также означает, что вам не нужно делать математику в своей голове, когда вы переходите из одного окна в другое, и вам нужно сравнивать временные метки.
Также запустите ntpd на всех компьютерах.
клиенты
Никогда не доверяйте действительной отметке времени, полученной с клиентского компьютера. Например, Date: HTTP-заголовки или Date.getTime()
вызов JavaScript . Это хорошо, когда они используются в качестве непрозрачных идентификаторов или когда выполняются вычисления даты во время одного сеанса на одном и том же клиенте, но не пытайтесь сопоставлять эти значения с чем-то, что есть на сервере. Ваши клиенты не запускают NTP и могут не обязательно иметь работающую батарею для своих часов BIOS.
пустяки
Наконец, правительства иногда делают очень странные вещи:
Стандартное время в Нидерландах было ровно на 19 минут и на 32,13 секунды больше, чем UTC по закону с 1909-05-01 по 1937-06-30. Этот часовой пояс не может быть точно представлен в формате ЧЧ: ММ.
Хорошо, я думаю, что я закончил.
GETDATE()
на SQL будет UTC (как будетDateTime.Now
). И сервер не будет зависеть от каких-либо автоматических изменений DST.