Обычно у меня есть «перехватчик», который прямо перед чтением / записью из / в базу данных выполняет преобразование DateTime (из UTC в местное время и из местного времени в UTC), поэтому я могу использовать DateTime.Now
(производные и сравнения) во всей системе, не беспокоясь о часовых поясах.
Что касается сериализации и перемещения данных между компьютерами, не нужно беспокоиться, так как datetime всегда UTC.
Следует ли мне продолжать хранить свои даты (SQL 2008 - datetime) в формате UTC или вместо этого следует хранить их, используя DateTimeOffset
(SQL 2008 - datetimeoffset)?
UTC Даты в базе данных (тип datetime) работают и известны так давно, зачем их менять? Каковы преимущества?
Я уже посмотрел в статьях , как этот , но я не 100% убежден , хотя. есть идеи?
источник
Ответы:
Есть одна огромная разница: вы не можете использовать только UTC.
Если у вас есть такой сценарий
Затем:
Но:
Простой пример - система бронирования авиабилетов ... Билет должен содержать 2 раза: - время «взлета» (в часовом поясе города «Из») - время «посадки» (в часовом поясе города «Пункт назначения»).
источник
InputLocationId
(или аналогичного нормализованного объекта). Здесь будут задействованы вычисления (привет, исключения ... особенно вы, Индиана ), но это все еще детерминированный процесс - и тогда баланс логики даты и времени приложения прост.Вы совершенно правильно используете UTC для всех исторических моментов времени (т. Е. Событий записи). Всегда можно перейти с UTC на местное время, но не всегда наоборот.
Когда использовать местное время? Ответьте на этот вопрос:
Сохраняйте местное время, только если ответ «да». Очевидно, это будет только для будущих свиданий, и обычно только для свиданий, которые так или иначе влияют на людей.
Зачем хранить часовой пояс / смещение?
Во-первых, если вы хотите записать, какое смещение было для пользователя, выполнившего действие, вам, вероятно, лучше всего просто сделать это, то есть при входе в систему запишите местоположение и часовой пояс для этого пользователя.
Во-вторых, если вы хотите преобразовать для отображения, вам нужно иметь таблицу всех переходов смещения местного времени для этого часового пояса, просто зная, что текущего смещения недостаточно, потому что, если вы показываете дату / время с шести месяцев назад, смещение будет будь другим.
источник
DATETIMEOFFSET дает вам возможность хранить местное время и время UTC в одном поле.
Это позволяет создавать очень простые и эффективные отчеты по местному времени или по всемирному координированному времени без необходимости каким-либо образом обрабатывать данные для отображения.
Это два наиболее распространенных требования - местное время для локальных отчетов и время UTC для групповых отчетов.
Местное время хранится в части DATETIME DATETIMEOFFSET, а OFFSET из UTC хранится в части OFFSET, поэтому преобразование выполняется просто и, поскольку оно не требует знания часового пояса, из которого были получены данные, все может быть выполнено на уровне базы данных. .
Если вам не требуется время до миллисекунд, например, до минут или секунд, вы можете использовать DATETIMEOFFSET (0). В этом случае для поля DATETIMEOFFSET потребуется только 8 байтов памяти - то же самое, что и для DATETIME.
Таким образом, использование DATETIMEOFFSET вместо UTC DATETIME обеспечивает большую гибкость, эффективность и простоту отчетности.
источник