2010-06-06 29 views
2

我有一個應用程序,當前在MySQL DATETIME和TIMESTAMP值中存儲時間戳。但是,應用程序需要能夠接受來自多個時區的用戶的數據,並在其他用戶的時區中顯示時間戳。因此,這是我打算修改申請的方式;我希望有任何改進方法的建議。PHP/MySQL時區遷移

數據庫修改

  • 所有時間戳將被轉換爲DATETIME值;這是爲了確保方法的一致性,並避免讓MySQL嘗試做出聰明的事情並轉換時區(我想在PHP中保留轉換,因爲它涉及對應用程序的較少修改,並且在我最終設法從MySQL中逃脫)。
  • 所有DATETIME值進行調整,以將它們轉換爲UTC時間(目前都在澳大利亞東部標準時間)

查詢修改

  • 現在所有使用()與UTC_TIMESTAMP)來代替(在查詢,觸發器,函數等

應用修改

  • 應用程序必須存儲時區和首選日期格式(例如,美國VS世界的其餘部分)
  • 的所有時間將根據用戶的設置顯示
  • 所有輸入時間戳將根據用戶的設置轉換爲UTC之前被輸入

附加之前轉換筆記

  • 轉換格式,將在應用層面做了幾個主要的原因
    • 的一個轉換時區的過程因數據庫和數據庫而異,因此將其轉換爲非便攜式(並且我希望在不久的將來可能會從MySQL中遷移出來)。
    • MySQL時間戳具有有限的範圍,以允許時間(〜1970至〜2038)
    • MySQL時間戳具有其它不希望的屬性,包括奇異自動更新行爲(如果不仔細禁用)和靈敏度到服務器區設置(和我懷疑我在今年晚些時候遷移到亞馬遜時可能會搞砸這些)。
    • 改變所有當前日期時間值並使用UTC_TIMESTAMP()代替NOW()的選擇是爲了避免服務器/連接時區設置出現任何問題,這將會修改NOW()但僅保留UTC_TIMESTAMP();見下面的例子。

VS UTC_TIMESTAMP()的實例NOW()

mysql> set time_zone = 'Australia/Canberra'; 
Query OK, 0 rows affected (0.06 sec) 

mysql> select now(), utc_timestamp(); 
+---------------------+---------------------+ 
| now()    | utc_timestamp()  | 
+---------------------+---------------------+ 
| 2010-06-06 14:31:36 | 2010-06-06 04:31:36 | 
+---------------------+---------------------+ 
1 row in set (0.00 sec) 

mysql> set time_zone = 'America/Los_Angeles'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> select now(), utc_timestamp(); 
+---------------------+---------------------+ 
| now()    | utc_timestamp()  | 
+---------------------+---------------------+ 
| 2010-06-05 21:31:43 | 2010-06-06 04:31:43 | 
+---------------------+---------------------+ 
1 row in set (0.00 sec) 

有什麼,我在這裏失蹤,或有沒有人有辦法更好的建議?

回答

1

有什麼我在這裏失蹤,或沒有人有更好的方法建議嗎?

你可能做了太多工作。

只要知道存儲的時間戳的時區,就可以輕鬆地將其轉換爲另一個時區。如果您使用的是現代版本的PHP,則內置DateTime class包含全面的時區管理。

你不一定需要所有時區轉換在數據庫如果他們已經考慮當地的時間,它被正確配置爲使用本地時區,即他們已經自洽。您只需簡單地將當地時間轉換爲用戶的時區,然後將時間記錄到時間戳中(其他用戶在時間戳記所有者的時區中查看時間)即可。

否則,您的計劃似乎經過深思熟慮和完整。

+0

現在日期時間值是一致的,但是當我遷移服務器時,我需要將服務器設置爲與當前時區相同,即使它實際上位於其他地方(我計劃轉移到Amazon的新加坡的位置,現在它正在運行)。如果我將服務器設置爲其實時區,則NOW()的值將發生變化,以便時間戳之間存在不一致性,而TIMESTAMP_UTC()將始終保持相同 – 2010-06-06 03:27:48

+0

否則,是,PHP 5.2帶有DateTime類使事情變得比以前更容易:)這將是該方法的應用程序級別部分。 – 2010-06-06 03:28:32

+0

正在等待服務器時區切換(尤其是當您不控制服務器時)是切換到UTC的一個非常好的理由。 – Charles 2010-06-06 04:55:31