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

Dar*_*ren 2 sql-server timezone datetime utc

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

谢谢

vmv*_*vel 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]
Run Code Online (Sandbox Code Playgroud)

一旦我们将夏令时纳入计算,它就会变得复杂.但是如果给定日期属于夏令时,则上述计算将不起作用.

那么如何计算夏令时?

  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

查看处理夏令时的解决方案 - http://vadivel.blogspot.com/2011/10/timezone-conversion-utc-to-cst-with.html