ответ

36

Вы должны хранить в UTC - если вы этого не сделаете, ваша историческая отчетность и поведение во время таких вещей, как летнее сбережение, смешно. GMT - местное время, при условии перехода на летнее время относительно UTC (это не так).

Презентация пользователям в разных часовых поясах может быть настоящим ублюдком, если вы сохраняете местное время. Легко настроить на локальный, если ваши исходные данные в UTC - просто добавьте смещение пользователя, и все готово!

Джоэл рассказал об этом в одном из подкастов (в кругу), - сказал он store your data in the highest resolution possible (ища «верность»), потому что вы всегда можете его окунуться, когда он снова погаснет. Вот почему я говорю, что хранить его как UTC, так как местное время вам нужно настроить для тех, кто не находится в этом часовом поясе, и это тяжелая работа. И вам нужно сохранить, например, когда экономится дневной свет при сохранении времени. ЮК.

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

Теперь, что касается отображения: Конечно, вы можете сделать это «3 минуты назад», но только если вы храните UTC - иначе данные, введенные в разные временные зоны, будут делать такие вещи, как дисплей, как «-4 часа назад» », что увлечет людей. Если вы собираетесь отображать фактическое время, люди любят иметь его в свое местное время - и если данные вводятся в несколько часовых поясов, вы можете сделать это с легкостью только в том случае, если вы храните UTC.

+0

Но, предположим, у вас есть система бронирования, и вы бронируете номер в часовом поясе с DST по 3 P.M. Когда происходит DST, смещение между GMT и часовым поясом конференц-зала изменяется на один час. Внезапно встреча забронирована в другое время! – 2009-07-07 09:49:43

+0

Ничего, я не понял, что вы бы конвертировали время в смещение DST момента встречи, поэтому он всегда будет в правом смещении. – 2009-07-07 10:00:46

+0

Нет, GMT не имеет дневного света. Если мы педантичны, то и UTC не является часовым поясом. GMT основан на среднем солнечном времени в Гринвиче. UTC основан на Atomic Time (TAI), скорректированном на целое число секунд (думаю, прыжок секунд), чтобы оставаться близко к солнечной фазе земли, хотя они могут отличаться на 0,9 секунды. Вам нужно будет продолжать встреча в течение нескольких лет, чтобы время вращения Земли заметно изменилось, но именно поэтому здесь существует сложность. – mc0e 2017-02-20 11:43:59

1

Лично я не вижу причин не хранить все в GMT, а затем использовать локальный часовой пояс пользователей, чтобы отображать время, относящееся к ним.

Если вы хотите отобразить относительное время, вам, очевидно, еще нужно время и выполнить перевод, но если вы действительно хотите сделать перевод, я думаю, что GMT по-прежнему ваш лучший вариант.

+0

Вопрос в том, во сколько автоматические процессы используются при передаче, скажем, сроков для людей? сохраняете ли вы часовой пояс пользователей, когда они это решили, и используете его во всех сообщениях? – DevelopingChris 2009-07-09 14:54:07

0

Мне нравится хранить в GMT и показывать только относительные («около 10 секунд назад», «5 месяцев назад»). Пользователям не нужно видеть фактические временные метки для большинства случаев использования.

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

Большинство приложений, однако, легче понять с помощью простого относительного времени.

1

Итак, я провел небольшой эксперимент с сервером MSSQL.

Я создал таблицу и добавил строку с текущим локализованным часовым поясом (Австралия). Затем я изменил свое время на GMT и добавил еще одну строку.

Даже эти строки были добавлены примерно на 10 секунд друг от друга, они появляются на сервере SQL, поскольку они находятся на расстоянии 10 часов друг от друга.

Если ничего другого, это по крайней мере говорит мне, что я должен хранить даты в конитивной манере, которая для меня добавляет вес аргументу для хранения их в виде GMT.

1

MS Dynamics хранит GMT, а затем на уровне пользователя знает вашу временную зону относительно GMT. Затем он отображает элементы в вашем часовом поясе.

Просто подумал, что я брошу это там, потому что это довольно большая группа в MS, и именно так они решили справиться с этим.

0

Обычно я использую только время Unix. не обязательно будущий сейф, но он работает очень хорошо.

0

Всегда храните в GMT (или UTC). Оттуда легко преобразовать в любое значение локального часового пояса.

5

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

Рассмотрите случай повторного назначения. Это происходит в 00:00 (для простоты), что составляет 1200 NZST (стандартное время Новой Зеландии) и 1000 AEST в Сиднее в Австралии.

Когда переход на летнее время вступает в силу в одной зоне, что должно произойти с назначением? В случае, если:

1a. Если изменение TZ находится в зоне «владелец» (кто забронировал его), то попытайтесь остаться на на такое же время рабочего стола (например, 10:00)?
1b. Если изменение TZ не находится в одной из зон другой Attendee встречи в то время не изменений

Последствия: Она двигается к всем остальным, неожиданно, из-за владельцев TZ изменения, но он остается «встречи 10 утра «что касается владельца .

'2. Как и выше, но наоборот.

Последствия: Он перемещается для владельца собрания (собрание 10 утра становится заседанием 9 утра, или v/v), что можно ожидать, но неудобно. Он остается за тем же временем настольных часов для других участников, пока они не пройдут свой собственный переход TZ.

Ни один из них не идеален. Рассмотрим случай двух назначений, один забронирован Лицом А, который встречается в 10 утра по местному времени, а другой забронирован Лицом В с Лицом А в качестве участника, который происходит в 9 утра. Если Person A и Person B находятся в разных TZ, тогда изменение DST может легко заставить их стать забронированными.

Если ваш ум немного согнулся в этот момент, я вполне понимаю.

Пункт, приведенный в этом примере, заключается в том, что для правильного выполнения любого из этих действий вам необходимо знать не только версию UTC по местному времени, но и TZ (а не смещение), в котором находился владелец, когда они забронировали его , В противном случае у вас нет другого выбора, кроме как принять вариант 2, молча, даже не сообщив кому-либо о том, что все изменилось с тех пор, как GMT не меняются и меняется только презентация ... не так ли? (нет, это ловушка, презентация имеет значение, когда ваша встреча в 10 утра движется сама по себе)

Я должен поблагодарить своего коллегу и друга Джейсона Поллока за это понимание.Прочтите his view here и последующую дискуссию iCal and VTIMEZONE.

12

Ответ, как всегда, «зависит».

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

Существуют определенные преимущества при хранении данных в UTC time_t - это единый int, позволяющий быстро сортировать и легко хранить.

Я вижу проблему как быть разбита на конкретные области:

  1. исторических данных
  2. будущее, Short Term Data
  3. будущее, Long Term данных

С следующих подклассов по каждому из них:

  1. Sys ТЕМ при условии
  2. Пользователь Предоставлено

Давайте посмотрим на них по одному.

Предоставленная система: Я бы порекомендовал запуск систем в UTC, тогда вы избегаете проблемы с часовым поясом и снова, никакой потери информации не наблюдается (это всегда UTC).

Исторических данные: Эти вещи, как файлы системного журнала, статистики процесса, отслеживание, комментарии дата/время и т.д. Данные не собираются менять, и дескриптор часового пояса не собирается менять заднее число. Для данных такого типа нет информации, потерянной при хранении информации в формате UTC, независимо от того, какой временной интервал был предоставлен. Таким образом, снимите часовой пояс.

Будущие, долгосрочные данные: Это события, которые либо достаточно далеко в будущем, либо будут продолжаться. Если они хранятся достаточно долго, дескрипторы часовых поясов гарантируются изменениями. Хорошим примером такого типа данных является «Еженедельное совещание по управлению». Это данные, которые вводятся один раз и, как ожидается, будут продолжать работать на бесконечность. Для этих значений важно определить, предоставлена ​​ли она системе или пользователю. Для данных, предоставленных пользователем, время должно храниться в часовом поясе создателя, все остальное приводит к потере информации. Эта потеря информации становится очевидной при изменении определения часового пояса, и время отображается для создателя как совершенно другое значение!

Как указал Bwooce, существует некоторая путаница, когда создатель и зритель находятся в разных часовых поясах. В этом случае я ожидаю, что приложение укажет, какие значения времени переместились из-за изменения часового пояса из их предыдущих местоположений.

Будущие, краткосрочные данные: Это данные, которые быстро станут историческими или действуют только на короткий период времени. Примерами могут быть интервальные таймеры, переходы по рейтингам и т. Д. Для этих данных, поскольку вероятность низкая, что определение изменится между созданием значения и временем, когда оно станет историческим, можно было бы уйти с отбрасыванием часового пояса.Однако я обнаружил, что эти ценности имеют плохую привычку становиться «будущими, долгосрочными данными».

После того, как вы решили сохранить часовой пояс, необходимо соблюдать осторожность при его сохранении.

  • Не храните часовой пояс в качестве смещения или полного дескриптора.

Если вы храните часовой пояс в качестве смещения, что вы будете делать, если часовой пояс изменится? Проходите ли вы через систему и делаете полное изменение существующих данных? Если вы это сделаете, вы сделали неверные исторические значения. Хорошими примерами этой ошибки являются Oracle и iCal. Oracle хранит информацию о часовом поясе как смещение от UTC, а iCal включает полный дескриптор для часовой пояс создания.

  • Сохраните его как имя.

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

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

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

1

Я предпочитаю хранить все с часовым поясом. клиент может решить, каким образом он должен быть представлен позже. Моя любимая библиотека для преобразования - PostgreSQL-Database.

2

Хранение всего в GMT/UTC представляется мне наиболее логичным. Затем вы можете указать дату и время в каждом часовом поясе.

Несколько ceveats:

  1. Если время задавалась только как раз часы стены, и что является ведущим представление, то это не совсем заданное время. Вы должны (и не можете) конвертировать его в любое GMT. НАПРИМЕР. 9:00 AM каждое утро. Другими словами: это нет (дата).
  2. Если вы сохранить дату и время будущего назначения, вы должны использовать смещение GMT, указанный входной часовой пояс и момент времени, сам. Так что если это встреча летом, сделанная зимой, например. западная европа, это +2: 00, allthough нормальное (зимнее время) смещение +1: 00. Это решит проблему каландра , о которой упоминается Bwooce .
  3. Конечно, то же самое, что относится к использованию правильного смещения при преобразовании в GMT применяется при преобразовании обратно в дату и время в какой-либо конкретной часовой пояс.

К счастью, при правильном использовании тип DateTime (.NET) заботится обо всех деталях хранения календарей и т. Д., И все это должно быть очень просто, когда вы знаете, как это работает.

1

Посмотрите здесь, w3c проделали отличную работу, отвечая на вопрос.

Посмотрите на прецеденты.

http://www.w3.org/TR/timezone/

Обратите внимание, что они рекомендуют хранящие DateTimes в формате UTC не GMT, GMT подлежит летнее время.