如何正确存储UTC日期时间并使用本地偏移量?

时间:2012-01-23 00:46:13

标签: sql-server datetime timezone utc

我将数据存储为UTC,但我对如何正确检索它感到困惑。我将值存储在MSSQL的datetime列中。目前我检索它的方法是将GMT偏移设置为开始日期时间范围和结束日期时间范围。我还需要将聚合应用于该日期时间字段(分组依据)并将其显示在用户的适当本地时区中。我遇到的问题是,如果我今天查找范围,它会提取正确匹配的列,但这些列中的日期时间值可能是不同的UTC天数;我白天分组。因此,例如当有人选择一天的开始和结束(今天)时,他们会看到昨天和今天的UTC日期时间值;但如果我尝试将GMT偏移应用于显示值,它仍然可能出现2个不同的日期。如何正确协调范围和显示?

谢谢

1 个答案:

答案 0 :(得分:5)

将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,则夏令时介于: 4月的第一个星期日凌晨2点至10月的最后一个星期日凌晨2点

  2. 如果年份> = 2007,则夏令时介于: 3月的第二个星期日凌晨2点至11月的第一个星期日凌晨2点

  3. UTC到CST(标准时间)= -6

  4. UTC到CDT(夏令时)= -5

  5. UTC到EST(标准时间)= -5

  6. UTC到EDT(DayLight Time)= -4
  7. 在此处查看处理夏令时的解决方案 - http://vadivel.blogspot.com/2011/10/timezone-conversion-utc-to-cst-with.html