簡體   English   中英

夏令時和UTC時間

[英]Daylight savings time and UTC time

我們使用的程序可以將時間戳記為UTC時間。 我們是猶他州的一家本地公司,因此受到夏時制的影響。

例如,如果我們現在接到的電話是MST 12:52:00 ,它將被保存為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'

例如,如果我們現在接到的電話是MST 12:52:00 ,它將被保存為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標識),您只需從本地時間減去偏移量即可。 或者,如果這樣更容易合理化,可以將其視為反轉符號並添加。

所以是的,當您在白天時,它將存儲在UTC的18:52:00 這是正確的行為。

我的第二個擔心是,如果我將數據庫中的日期轉換為本地時間,那么我必須先檢查它是否為DST,然后再檢查是否為時間-6,否則為-7?

是的,但是請記住,這是您要轉換的時間戳反映的日期和時間。 無論您當前是否在DST中都沒有關系。

但是,請記住,如果可以幫助, 通常應避免在數據庫層中進行時區轉換。 在絕大多數用例中,這都是應用層的問題。

例如,如果要從.NET內置的應用程序寫入SQL Server,則可以將TimeZoneInfo類與"Mountain Standard Time" ID(適用於MST和MDT)一起使用。 或者,您可以使用Noda Time庫,其TZDB標識符為"America/Denver"

通過使用庫,您不必擔心DST何時開始和停止的所有各種細節,也不必擔心DST在世界各地的歷史變化。

在極少數情況下,您實際上需要在數據庫級別完成時區轉換,您當然可以編寫自己的存儲過程或UDF(例如,鏈接到的某些問題注釋),但是根據您的需要,它們可能不是足夠。 通常,它們傾向於僅對一組固定規則進行時區轉換編碼,因此它們不會考慮其他時區或歷史更改。

有一些針對SQL Server的通用時區解決方案, 但是與其他數據庫平台不同,沒有內置任何內容 我將推薦我的“ SQL Server時區支持 OSS”項目,如果您進行搜索,還會發現其他項目。 不過說真的,你應該希望不是需要這個,也應該做到在應用層中的轉化盡可能。

更新:在SQL Server 2016 CTP 3.1中,現在通過AT TIME ZONE語句內置了對時區的支持。 有關示例,請參見CTP公告

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM