2010-09-02 41 views
2

因此,在我的PHP代碼中,我爲用戶做了時區選擇,其中我有一個時區和GMT小時移位值的表格。然後,只要用戶在SETTINGS中選擇他的時區,我就可以使用它添加到DATETIME列值中。時區PHP和SQL中的夏令時問題

所以我有兩個功能:從數據庫中的DATETIME列讀取數據,並寫入DATETIME列。顯然,第一個需要在將時區差異顯示給用戶之前「添加」時區差異(在SQL中使用DATEADD()),而第二個需要在將時區差異存儲到數據庫之前「減去」時區差異DATEADD())。這樣,我所有存儲的時區都在GMT,並根據用戶的時區選擇進行查看。

但是,夏令時是問題所在。我應該採取什麼方法(無論是在SQL級別還是PHP級別)來解決這個問題?在SQL中使用DATEADD()足以照顧DAYLIGHT儲蓄?我沒有任何線索。請幫忙!

+0

不知道它是如何處理的,但也有像紐芬蘭時區UTC -3:30那樣好的邊緣情況...只是想我會提醒你那個可愛的扳手。 – CaffGeek 2010-09-02 21:50:50

+0

SQL Server 2008 R2企業版 – johnshaddad 2010-09-02 21:51:35

+0

那麼你們建議如何解決這個問題?這種情況下最好的辦法是什麼?我位於加拿大,所以我們確實有夏令時。那麼,我該如何解決這個問題?只要你可以建議替代品,我很好,不使用DATEADD()。 – johnshaddad 2010-09-02 21:54:58

回答

2

使用SQL 2008,您將獲得新的數據時間DATETIMEOFFSET,它具有時區感知作爲偏移量(而不是時區名稱)。使用此數據類型,您可以獲取任何值的UTC時間,然後可以根據用戶時區(這是屬於PHP代碼的轉換)正確渲染它。另一種選擇是始終將UTC存儲在舊的DATETIME數據類型中。不管你做什麼,從用戶本地到UTC和從UTC到用戶本地的翻譯屬於PHP中的呈現,而不屬於SQL,因此DATEADD尚未放置在此代碼中。 PHP DateTime具有時區支持,可以識別夏令時。

+0

感謝您的信息!您能否詳細說明在PHP中使用DateTime,以及我應該通過哪些參數來了解我需要夏令時?假設我有EST作爲用戶的默認時區,並且數據庫是DATETIMEOFFSET(UTC)。我現在應該怎麼做: 1)從UTC讀取日期到EST 2)將日期從EST寫入UTC 另外,是否需要在服務器端設置任何內容來定義服務器時區? (例如PHP系統常量?) 在此先感謝! – johnshaddad 2010-09-03 03:01:55

0

格林威治標準時間沒有夏令時,所以你所有的存儲時間都不應該有夏時制。在您存儲和檢索之前,您還應該計算夏令時。世界上只有一些地區使用它。

所以在回答你的問題時,沒有DATEADD()不夠好。如果你已經找到了它們的位置,那麼如果該時區用於夏令時,可以另外安置一張桌子或其他東西。但即使在一些地區,一些地區也有夏令時,其他地區則沒有。

+0

所以,你的意思是我需要首先將數據庫中的所有日期設置爲EST,並且要有夏時制時區的完整表格,然後每當用戶選擇/插入日期時,我需要檢查其默認時區,如果這是一個夏令時時區,如果夏令時間與CURRENT時間相匹配,則添加日光差異?我的理解是否正確? 此外,當我設置數據庫中的時區爲EST例如,是否意味着我需要物理指示SQL Server(某些設置?)來設置時區?或者僅僅是有約會日期存儲在EST? – johnshaddad 2010-09-02 22:04:15

+0

您應該使用Remus發佈的內容,但要回答您的問題。您應該使用UTC而不是任何其他時區來存儲所有內容,這樣您就可以輕鬆地將SQL轉換爲任何其他語言的區域。是的,你正確理解它,但Remus提供了一個更好的解決方案。 – 2010-09-03 13:18:07