Подтвердить что ты не робот

Обработка часовых поясов в хранилище?

Сохранить все в GMT?

Сохранять все, как было введено со встроенным смещением?

Выполняйте математику каждый раз при рендеринге?

Показывать относительные времена "1 минута назад"?

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

  • Исторические данные
  • Будущие, краткосрочные данные
  • Будущие долгосрочные данные

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

  • Предоставленная система
  • Предоставлено пользователем

Посмотрим на них по одному.

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 3

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

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

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

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

Последствия: он движется для   все остальные, неожиданно, из-за   владельцы TZ меняются, но он остается    "10-часовая встреча" в отношении   владелец.

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

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

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

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

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

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

Ответ 4

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

Несколько ceveats:

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

Посмотрите на варианты использования.

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

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

Ответ 10

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

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

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

Ответ 11

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

Ответ 12

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