2016-11-24 50 views
5

我的環境

我在法國巴黎UTC+1CET)在Postgres數據庫處理。我們在2016年11月25日
我的Postgres數據庫託管在亞馬遜網絡服務eu-west-1地區。特有的時區上的AWS RDS

與特定的時區設置的問題

查詢爲current_date(或current_time)似乎提供一點效果都沒有一致......我的信念。

特別是,使用CET時區或UTC+1時,查詢current_date會產生不同的結果。

SET TIME ZONE 'UTC+01'; 
select current_date, current_time; 
 
+------------+--------------------+ 
| date  | timetz    | 
+------------+--------------------+ 
| 2016-11-24 | 22:00:01.581552-01 | 
+---------------------------------+ 

不,那是昨天 - 兩個小時前。


SET TIME ZONE 'CET'; 
select current_date, current_time; 

SET TIME ZONE 'Europe/Paris'; 
select current_date, current_time; 
 
+------------+--------------------+ 
| date  | timetz    | 
+------------+--------------------+ 
| 2016-11-25 | 00:00:01.581552-01 | 
+---------------------------------+ 

有正確的時間和日期。

問題

這是怎麼回事?
這對我來說太晚了嗎?我混合了UTC+1UTC-1,還是有更大的東西可以忽略?

回答

2

這個問題似乎與Amazon RDS無關:它與PostgreSQL使用的慣例有關。在這種情況下,你時區名稱倒退。你的意思是'UTC-01'你在哪寫 'UTC+01'
the manual

另一個問題需要注意的是,在POSIX時區名稱, 積極的偏移用於位置格林威治西。其他地方,PostgreSQL遵循ISO-8601慣例,即積極的 時區偏移量爲東部格林威治。

'CET''UTC-01'因爲他們沒有采取規則夏令時考慮都巴黎仍可能錯誤
(DST是在人類歷史上最魯鈍的概念之一。)

巴黎(最喜歡的歐洲國家)在夏季和冬季期間CEST使用CET。您在'CET'的測試剛好在11月份開始。如果你在夏天嘗試相同的話,你會得到錯誤的結果。

爲了安全起見,請始終使用時區名稱'Europe/Paris',它考慮了DST規則。通話費用較高。

如果您的時區設置暗含任何功能,則函數current_time將考慮DST規則。但'UTC-01'是一個簡單的時間偏移量。我從不使用數據類型time with time zonecurrent_time開始。該手冊一次:

我們做建議使用類型time with time zone

考慮(儘管PostgreSQL出於合理應用以及爲了遵守 與SQL標準的支持 ):

SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC+01' AS plus_wrong 
    , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC-01' AS minus_right 
 plus_wrong  |  minus_right  
---------------------+--------------------- 
2016-06-05 23:00:00 | 2016-06-06 01:00:00 
SELECT '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'CET' AS cet_winter 
    , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CEST' AS cest_summer 
    , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CET' AS cet_no_dst -- CET wrong! 
 cet_winter  |  cest_summer  |  cet_no_dst  
---------------------+---------------------+--------------------- 
2016-01-01 01:00:00 | 2016-06-06 02:00:00 | 2016-06-06 01:00:00 -- wrong 
SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_summer 
    , '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_winter 
paris_summer   | paris_winter 
----------------------+---------------------- 
2016-06-06 02:00:00 | 2016-01-01 01:00:00 -- always right 

相關:

+1

地獄,我想我只是必須有它錯了,但我不知道有一個約定,其中一個**正時區偏移**不對應於正的實際時間偏移量。那麼,正如你指出的那樣,我們用時間表示看到並做了更糟糕的事情!感謝您對手冊的超級清晰參考以及在幾個月內阻止我撓頭的非常有用的額外信息':)'。 – ccjmne