2012-08-22 135 views

回答

2

對於PostgreSQL,你的表應該有timestamp with time zone型(timestamptz的簡稱)這樣的柱:

CREATE TABLE tbl (id serial, ts timestamptz); 

如果你想儲存什麼(我們稱之爲my_ts)是...

  • 一個本地timestamp without time zone,即它的timezone在當前設置一致客戶端:
    插入原樣,一切都將被保存爲UTC內部自動:

    INSERT INTO tbl (ts) VALUES my_ts' 
    
  • 一個timestamp with time zone
    插入的是,一切都在內部自動保存爲UTC:

    INSERT INTO tbl (ts) VALUES my_ts; 
    
  • 一個timestamp without time zone但是從另一個時區
    說,你得到timestamp without time zone值fr om奧運倫敦,但你的客戶認爲你在不同的時區。變換的時間戳與AT TIME ZONE結構:

    INSERT INTO tbl (ts) VALUES my_ts AT TIME ZONE 'Europe/London'; 
    

如果您使用的時區的名稱(而不是一個時區的縮寫,BST在這種情況下),DST(夏令時間)的規則自動應用。詳情請見related question
更多關於timestamp handling in PostgreSQL in this related answer。現在


,如果你想顯示tbl.ts爲UTC(〜GMT)timestamp without time zone,不管你當前時區的,檢索值是這樣的:

SELECT ts AT TIME ZONE 'UTC' FROM tbl; 

注意AT TIME ZONE不同效果適用於timestamptz時比timestampRead the manual carefully

+0

感謝您的闡述 - 可能會刪除我的答案,因爲您已經更全面地介紹了答案。數據庫中的時間很複雜,呃。 –

2

時間在timestamp with time zone(和舊式timestamp,但你不應該一般使用)始終以PostgreSQL中的UTC(「GMT」)存儲。它們被轉換爲UTC格式並從UTC格式顯示。如果你希望他們被視爲UTC的輸入和輸出:

SET timezone = 'UTC' 
在每個會話

,或者設置在數據庫或用戶級帕拉姆。如果您的應用程序在UTC以外的時區,則必須發送符合時區的所有時間戳;你已經告訴系統「本地時間」是UTC。

AT TIME ZONE結構可以,如果你希望明確的時間戳轉換爲默認值以外的時間段,比如有用:

regress=# SELECT TIMESTAMP '2012-01-01 00:00:00 UTC' AT TIME ZONE '+08:00'; 
     timezone   
------------------------ 
2012-01-01 16:00:00+08 
(1 row) 
2

http://dev.mysql.com/doc/refman/5.5/en/datetime.html

MySQL的TIMESTAMP值從當前時間轉換從UTC到 存儲區,並從UTC返回到當前時區進行檢索。 (對於DATETIME等其他類型不會發生這種情況。)默認情況下,每個連接的當前時區爲服務器的時間。

0

您正在查找的關鍵字是UTC而不是GMT(「對於大多數常見目的,UTC與GMT同義,但GMT不再由科學界精確定義。」,wikipedia)。

對於MySQL,您可以使用CONVERT_TZ()函數(請注意手冊中關於命名時區的警告,如果設置不正確,它可能會中斷查詢)。

只需謹慎一點:在MySQL和您的應用程序之間使用時區轉換沒有100%可靠的方法(請參閱my blog post about mysql time zone conversions以詳細瞭解這是爲什麼)。最好將UTC日期時間字符串直接傳遞給MySQL(例如,通過在應用程序本身中進行轉換)。如果您需要可靠性,您幾乎總是最終將日期時間存儲在使用UTC格式的日期字符串的DATETIME字段中。

相關問題