Ответ, как всегда, «зависит».
Это зависит от того, что вы описываете со временем, и как данные были вам предоставлены.
Ключом к решению о том, как хранить значения времени, является принятие решения о том, теряете ли вы информацию, удаляя часовой пояс, а также не удивляя своих пользователей.
Существуют определенные преимущества в хранении данных в UTC time_t - это единственное целое число, обеспечивающее быструю сортировку и простое хранение.
Я вижу, что проблема разбита на определенные области:
- Исторические данные
- Future, краткосрочные данные
- Будущее, долгосрочные данные
Со следующими подклассами на каждом:
- Предоставленная система
- Предоставлено пользователем
Давайте посмотрим на них по одному.
Предоставлено системой : Я бы порекомендовал запускать системы в UTC, тогда вы избежите проблемы с часовым поясом и снова не будет потеря информации (это всегда UTC).
Исторические данные : Это такие вещи, как файлы системного журнала, статистика процесса, трассировка, дата / время комментариев и т. Д. Данные не будут меняться, а дескриптор часового пояса не будет изменить задним числом. Для данных такого типа информация не теряется при хранении информации в формате UTC независимо от часового пояса, в котором она была предоставлена. Поэтому удалите часовой пояс.
Будущие, долгосрочные данные : Это события, которые либо достаточно далеко в будущем, либо будут происходить. Если они хранятся достаточно долго, дескрипторы часовых поясов гарантированно меняются. Хорошим примером такого типа данных является «Еженедельное собрание руководства». Это данные, которые вводятся один раз, и ожидается, что они будут работать вечно. Для этих значений важно определить, предоставлены ли они системой или пользователем. Для предоставленных пользователем данных время должно храниться вместе с часовым поясом создателя, все остальное приведет к потере информации. Эта потеря информации становится очевидной, когда меняется определение часового пояса, и время отображается для создателя как имеющее совершенно другое значение!
Как указал Bwooce, существует некоторая путаница, когда создатель и зритель находятся в разных часовых поясах. В этом случае я ожидаю, что приложение укажет, какие значения времени были перемещены из-за смещения часового пояса от их предыдущих местоположений.
Будущие, краткосрочные данные : Это данные, которые быстро станут историческими или действительными только в течение короткого периода времени. Примерами могут быть интервальные таймеры, рейтинговые переходы и т. Д. Для этих данных, поскольку вероятность того, что определение изменится между созданием значения и временем, когда оно станет историческим, может оказаться возможной, если отбросить часовой пояс. Однако я обнаружил, что эти ценности имеют плохую привычку превращаться в «Будущие, долгосрочные данные».
После того, как вы решили сохранить часовой пояс, нужно позаботиться о том, как он хранится.
- Не храните часовой пояс как смещение или полный дескриптор.
Если вы сохраняете часовой пояс как смещение, что вы будете делать, если часовой пояс изменится? Пройдете ли вы через систему и внесете ли общие изменения в существующие данные? Если вы это сделаете, вы теперь сделали любые исторические значения неверными. Хорошими примерами этой ошибки являются Oracle и iCal. Oracle хранит информацию о часовом поясе как смещение от UTC, а iCal включает полный дескриптор для создания часового пояса.
Это позволяет изменять определение часового пояса без необходимости изменять существующие значения, которые у вас есть. Это усложняет сортировку, поскольку любой сгенерированный индекс может быть недействительным при изменении данных часового пояса.
Если разработчики продолжат хранить все в UTC, независимо от часового пояса, мы продолжим видеть проблемы, которые мы наблюдали с последней партией изменений часового пояса.
В одной организации секретари должны были распечатать календари для своих команд до даты перехода на летнее время, а затем распечатать их снова после изменения. Наконец, они сравнили их и воссоздали все перенесенные встречи. Конечно, они пропустили несколько, и было несколько недель боли, пока старая дата перехода на летнее время не была достигнута, и времена снова стали правильными.