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

Хранение DateTime (UTC) и сохранение DateTimeOffset

У меня обычно есть "перехватчик", который прямо перед чтением/записью из/в базу данных делает преобразование даты и времени (от UTC до localtime и от localtime до utc), поэтому я могу использовать DateTime.Now(деривации и сравнения) в течение система, не беспокоясь о часовых поясах.

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

Должен ли я продолжать хранить мои даты (SQL 2008 - datetime) в формате UTC или я должен вместо этого хранить его с помощью DateTimeOffset (SQL 2008 - datetimeoffset)?

UTC Даты в базе данных (тип даты и времени) работают и известны так долго, зачем это менять? В чем преимущества?

Я уже рассматривал такие статьи, как этот, но я не уверен на 100%. Любые мысли?

4b9b3361

Ответ 1

Существует одна огромная разница, в которой вы не можете использовать только UTC.

  • Если у вас такой сценарий

    • Один сервер и несколько клиентов (все географически в разных часовых поясах)
    • Клиенты создают некоторые данные с информацией о времени и времени
    • Клиенты хранят все это на центральном сервере
  • Тогда:

    • datetimeoffset хранит время UTC и ALSO offset в локальное время клиента
    • все клиенты знают время UTC всех данных, а также местное время в том месте, откуда была отправлена ​​информация.
  • Но:

    • UTC datetime хранит только время UTC datetime, поэтому у вас нет информации о локальном времени в месте расположения клиента, в котором были созданы данные
    • Другие клиенты не знают местное время места, где информация о времени и времени поступала из
    • Другие клиенты могут рассчитывать только свое местное время из базы данных (используя время UTC), а не локальное время клиента, откуда возникли данные.

Простым примером является система бронирования авиабилетов... Летный билет должен содержать 2 раза: - "снять" время (в часовом поясе города "От" ) - время "посадки" (в часовом поясе города "Назначение" )

Ответ 2

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

Когда использовать местное время? Ответьте на этот вопрос:

Если правительство вдруг решит изменить летнее время, вам это понравится  данные для изменения?

Сохранять только локальное время, если ответ "да". Очевидно, что это будет только для будущих дат и обычно только для дат, которые каким-то образом влияют на людей.

Зачем хранить часовой пояс/смещение?

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

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

Ответ 3

DATETIMEOFFSET дает вам возможность сохранять местное время и время UTC в одном поле.

Это позволяет очень простой и эффективный отчет в локальном или UTC-времени без необходимости обрабатывать данные для отображения любым способом.

Это два наиболее распространенных требования - местное время для локальных отчетов и время UTC для отчетов групп.

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

Если вам не требуется время до миллисекунды, например, всего минут или секунд, вы можете использовать DATETIMEOFFSET (0). Поле DATETIMEOFFSET будет требовать только 8 байтов хранения - то же, что и DATETIME.

Использование DATETIMEOFFSET, а не UTC DATETIME, дает большую гибкость, эффективность и простоту отчетности.