夏令时和UTC时间

时间:2015-11-05 20:03:41

标签: sql sql-server tsql dst

我们使用以UTC时间保存时间戳的程序。我们是犹他州的本地公司,所以我们受到夏令时的影响。

例如,如果我们现在接到一个电话,它是12:52:00 MST,它将作为19:52:00保存在数据库中。

我的第一个问题是明年DST在2016年3月13日再次开始时,我会在同一时间运行。 UTC中的时间戳是18:52:00还是19:52:00

我的第二个问题是,如果我将数据库中的日期转换为当地时间,那么我必须首先检查它是否为DST,然后是否需要时间-6,如果不是,则为-7?

所以使用上面的例子:

IsDST = 01:52:00 (-6)
IsNotDST = 12:52:00 (-7)

我认为我需要担心必须转换为/从UTC转换?

除了上述两个问题之外,我的主要问题。 SQL Server / T-SQL中是否有内容可以为我处理这种转换,或者我是否需要自己编写所有内容以满足需求?

我已经开始了,但现在需要在DST工作,如果有必要的话

DECLARE @declared_start_datetime DATETIME, 
        @declared_end_datetime DATETIME, 
        @converted_start_datetime DATETIME, 
        @converted_end_datetime DATETIME

SET @declared_start_datetime = '11/04/2015 07:00:00' -- Hour we open phones
SET @declared_end_datetime = '11/04/2015 18:00:00' -- Hour we close phones
SET @converted_start_datetime = DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), @declared_start_datetime)
SET @converted_end_datetime = DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), @declared_end_datetime)

select @declared_start_datetime as 'Declared Start', 
       @declared_end_datetime as 'Declared End'
select @converted_start_datetime as 'Converted Start',
       @converted_end_datetime as 'Converted End'

1 个答案:

答案 0 :(得分:3)

  

例如,如果我们现在接到一个电话,它是12:52:00 MST,它将作为19:52:00保存在数据库中。

     

我的第一个问题是明年DST在2016年3月13日再次开始时,我会在同一时间运行。 UTC中的时间戳是18:52:00还是19:52:00

山地标准时间为UTC-7,美国山区夏令时为UTC-6。如果您写出转换中涉及的完整日期,时间和偏移量,则更容易推理。这是标准的ISO8601扩展格式:

2015-11-06T12:52:00-07:00 = 2015-11-06T19:52:00Z
2016-03-13T12:52:00-06:00 = 2016-03-13T18:52:00Z

等式左边的每个本地时间都标有当时正确的本地时间和本地偏移量。然后到达UTC(由Z标识),您只需从当地时间减去偏移量。或者,将其视为反转符号并添加,如果这更容易合理化。

所以是的,当你在白天时,它会将它存储在18:52:00 UTC。这是正确的行为。

  

我的第二个问题是,如果我将数据库中的日期转换为当地时间,那么我必须首先检查它是否为DST,然后是否需要时间-6,如果不是,则为-7?

是的,但请记住,它是您转换时间戳所反映的日期和时间。您是否目前在DST中没有任何区别。

但是,请记住,如果您可以全部帮助,那么在数据库层中应该避免通常时区转换。在绝大多数用例中,它都是应用层关注的问题。

例如,如果您从.NET内置的应用程序写入SQL Server,那么您可以使用TimeZoneInfo类和"Mountain Standard Time" ID(适用于MST和MDT)。或者,您可以使用Noda Time标识为"America/Denver"的{​​{3}}库。

通过使用图书馆,您不必关心DST何时开始和停止的所有细节,以及它在世界不同地区的历史变化。

在极少数情况下,您确实需要在数据库级别完成时区转换,您当然可以编写自己的存储过程或UDF(例如链接到的一些问题注释),但根据您的需要,可能还不够。通常,他们倾向于只编码一组固定的时区转换规则,因此他们不会考虑其他时区或历史变化。

SQL Server有一些通用的时区解决方案,但与其他数据库平台不同,中没有内置任何内容。我推荐我的TZDB OSS项目,如果你搜索,还有其他项目。但实际上,您应该希望需要这个,并且应尽可能在应用程序层进行转换。

更新:对于SQL Server 2016 CTP 3.1,现在可以通过SQL Server Time Zone Support语句内置对时区的支持。请参阅AT TIME ZONE