Как правильно хранить дату и время UTC и работать с локальным смещением? - PullRequest
2 голосов
/ 23 января 2012

Я храню данные как UTC, но я очень запутался, как правильно их получить.Я храню значение как UTC в столбце datetime в MSSQL.В настоящее время я извлекаю его, устанавливая смещение по Гринвичу для начального диапазона даты и времени и конечного диапазона времени.Мне также нужно применить агрегирование к этому полю даты и времени (сгруппировать по) и отобразить его в соответствующем местном часовом поясе пользователя.Проблема, с которой я сталкиваюсь, заключается в том, что если я найду диапазон сегодня, он найдет столбцы, которые соответствуют друг другу, но значение datetime в этих столбцах может отличаться в днях UTC;Я группируюсь по дням.Так, например, когда кто-то выбирает диапазон для начала дня и конца (для сегодняшнего дня), ему представляются значения времени и времени UTC вчера и сегодня;но если я попытаюсь применить смещение по Гринвичу к отображаемому значению, оно все равно получится как две разные даты.Как правильно согласовать диапазон и отображение?

Спасибо

1 Ответ

5 голосов
/ 23 января 2012

Преобразование даты в формате UTC в стандартное время CST или EST (например) является прямым. Мы должны хранить значение смещения в отдельном столбце или таблице для каждого часового пояса, который нам нужен в нашем приложении.

Например: от UTC до CST -6 часов. Аналогично, UTC для EST составляет -5 часов.

DECLARE @UTC_Date DATETIME
SET @UTC_Date = GETUTCDATE()

SELECT
 @UTC_Date AS [UTC],
 DATEADD(hh, -6, @UTC_Date) AS [CST - Standard Time],
 DATEADD(hh, -5, @UTC_Date) AS [EST - Standard Time]

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

Как рассчитывается переход на летнее время?

  1. Если год <= 2006, то переход на летнее время составляет: 2 часа ночи в первое воскресенье апреля до 2 часов ночи в последнее воскресенье октября </p>

  2. Если год> = 2007, то переход на летнее время составляет: 2 часа ночи во второе воскресенье марта до 2 часов ночи в первое воскресенье ноября

  3. UTC до CST (стандартное время) = -6

  4. UTC к CDT (дневное время) = -5

  5. UTC до EST (стандартное время) = -5

  6. UTC до EDT (дневное время) = -4

Проверьте решение для перехода на летнее время здесь - http://vadivel.blogspot.com/2011/10/timezone-conversion-utc-to-cst-with.html

...