我们使用以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'
答案 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?
是的,但请记住,它是您转换时间戳所反映的日期和时间。您是否
但是,请记住,如果您可以全部帮助,那么在数据库层中应该避免通常时区转换。在绝大多数用例中,它都是应用层关注的问题。
例如,如果您从.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
。