2011-08-12 99 views
2

我有這個問題很長一段時間。問題在於:我所使用的大多數SQL服務器(即MySQL)都不會將時區信息與日期一起存儲,所以我假設他們只是將日期存儲爲相對於服務器的本地時區。如果我必須將服務器遷移到不同的時區,或者創建的服務器分佈在不同的數據中心上,或者如果我需要將日期/時間正確地轉換爲本地值,那麼這會產生一個有趣的問題。我應該如何在SQL中存儲日期/時間對象?

例如,如果我堅持像2011-08-12 12:00:00 GMT-7這樣的日期,則它將持續爲2011-08-12 12:00:00。如果我有一個特定時間在世界各地發生的事件,我不得不假定我的服務器存儲日期格式爲GMT-0700(我們甚至不會將夏令時添加到混合中),然後將它們轉換爲日期,具體取決於每個日期用戶的本地時區。如果我有多個服務器在他們自己的時區中存儲日期,所有這些都會失敗。

對於像Hibernate和Django這樣的框架,他們如何處理這個問題?我錯過了什麼,或者這是一個重大問題?

回答

4

正如我所看到的,最好的選擇是:

  • 將所有時間轉換爲UTC時,將它們存儲在數據庫中,並將它們從UTC進行本地化以顯示
  • 以分鐘爲單位存儲UTC偏移量(至少一個現代時區是偏離UTC的十分鐘倍數)從日期/時間
  • 存儲時間戳作爲字符串

在我目前的項目中,我們遇到了這個問題(我們使用的Postgres),並決定將所有時間存儲在UTC和轉換需要在應用程序中單獨列。沒有單獨存儲我們的時區。我們還決定所有使用時間戳的客戶端 - 服務器交互都將採用UTC,並且本地時區將僅用於用戶交互。到目前爲止,這個結果很好。

既然你用Django標記了這個問題,我會補充說pytz模塊對於處理區域設置的時區轉換是非常有用的。

+0

這是最有意義的。我認爲數據庫會自動處理這樣的東西,但是,嘿,沒關係。我可能會將所有內容存儲在UTC中,並根據客戶端時間進行翻譯。我如何強制Django保存在UTC?我有很多使用'auto_now'和'auto_now_add'的字段,這可能會使事情變得複雜。 –

+0

您需要使用'pytz'來完成轉換,然後使用Django來存儲「裸體」時間戳。因爲時區是如此混亂和政治化的概念,所以有一些學習曲線,但老實說API非常好,它涵蓋了所有的角落案例。 – wberry

+0

所以我不應該依賴'auto_now'和'auto_now_add',而應該手動設置這些東西? –

0

你的MySQL答案就在本頁面MySQL Server Time Zone Support

基本上MySQL提供了使用UTC(時間戳)字段中的任何字段,但不爲不自動領域的支持時區(日期,時間和日期時間字段) 。對於UTC字段,您可以使用SET time_zone = timezone;從客戶端設置時區。對於非UTC領域,您必須自己計算。

+0

所以我應該簡單地存儲每個日期時間和日期對象作爲UTC,以保持一致? –

+0

是的,因爲時區存儲爲UTC的偏移量。 –

0

你說的很對,我經常碰到這種情況,並且傾向於查看TZ並將其存儲在一個靜態的「VARS」表中,這樣至少我可以稍後再移動它。

旁註:

  • 有趣的DATETIME manual甚至沒有提到它
  • 它現在的影響()和CURTIME()如圖所示here

HTH

相關問題