我認爲這兩個禍害之一是時間戳和時區(另一個是字符編碼)的神祕面紗,其中一個保持一遍又一遍在磕磕絆絆......PostgreSQL和時間戳
在這方面,我目前在存儲到PostgreSQL數據庫的Java應用程序中存在與不同時間戳有關的問題。
爲了保持簡單起見,假設具有如下表:
CREATE TABLE ts_test
(
id integer NOT NULL,
utc timestamp without time zone,
local timestamp with time zone,
CONSTRAINT pk PRIMARY KEY (id)
)
所以,我必須存儲UTC時間戳和一個本地的,這在我的情況是歐洲中部夏令時間,所以目前UTC +2。
進一步假設具有表中,psql的控制檯上的輸出如下(數據庫UTC運行)2項:
# select id, utc, local, local-utc as diff from ts_test;
id | utc | local | diff
----+---------------------+------------------------+----------
1 | 2012-06-27 12:00:00 | 2012-06-27 12:00:00+00 | 00:00:00
2 | 2012-06-27 12:00:00 | 2012-06-27 14:00:00+00 | 02:00:00
(2 rows)
現在,有幾個問題就出來了:
- 究竟本地列中的輸出是否意味着?
- 系統如何知道時區,我插入的值?
- 如何查看存儲的實際原始值(例如毫秒)?
我假設第一行的本地「12:00:00 + 00」意味着它是UTC中的12:00,它在CEST中又是14:00。但看起來(我們的數據庫管理員告訴我的),第二行的本地「14:00:00 + 00」是14:00 CEST的正確值 - 這是2小時的差異支持的。
但產生通過SQL INSERT二號線,我必須寫
insert into ts_test (id, utc, local) values (2, '2012-06-27 12:00:00', '2012-06-27 16:00:00+02');
再次不支持的預測。
因此,總結這個長問題 - 任何人都可以啓發我詳細說明整個事情的工作原理,輸出應該是什麼意思,以及如何正確地將本地時間戳寫入數據庫? 。
「+ 00」部分是凍結的時區偏移量。您可能想要捕獲實際的時區名稱。任何觀察夏令時的地區都會在一年中從一個「時區」轉到另一個「時區」。在任何情況下,您的本地時間都存儲爲零偏移量,這意味着UTC,這是不正確的。有關[Postgres日期/時間文檔](http://www.postgresql.org/docs/9.2/static/datatype-datetime.html)中的更多信息。 – tadman
@tadman:謝謝你的提示。我已經考慮過PostgresQL文檔,但還沒有回答我的問題。 - 根據您鏈接的頁面,它表示時間戳記始終以UTC格式存儲,但在特定時區輸出。所以,是問題的一部分,我的數據庫以UTC運行,儘管我在CEST中編寫本地日期?當我將時區參數改爲'歐洲/柏林'時,那麼我得到所有當地人和差異的+2的輸出。這又會支持我對第一線的假設,但我被告知,第二條線是正確的。 *仍然困惑* –
列類型實際上是「帶時區*偏移*的時間戳」,因爲實際時區產生的偏移量未被記錄。在一年的不同時間有很多UTC + 2時區。 – tadman