Postgresql
為什麼 postgresql 區分命名時區符號和數字時區符號?
為什麼命名時區和數字時區偏移量之間存在差異,兩者都會產生不同的 UTC 時間戳
TIMESTAMPTZ
?假設
Europe/Prague
時區,目前是+02:00
(DST);寫作時間是2018-08-25
。您可以通過 google進行檢查:
此外,在我的 postgres 安裝中,我可以查詢它:
SELECT utc_offset FROM pg_timezone_names where name = 'Europe/Prague';
這也產生了
02:00:00
。那麼,到底為什麼在執行以下兩個查詢時會得到兩個不同的 UTC 時間戳?
以下產生
2018-08-25T20:00:00.000Z
(2018-08-25 18:00:00-02
):SET TIME ZONE '+02:00'; -- with or without the plus SELECT '2018-08-25 18:00:00'::TIMESTAMPTZ;
以下產生
2018-08-25T16:00:00.000Z
(2018-08-25 18:00:00+02
),這是正確的:SET TIME ZONE 'Europe/Prague'; SELECT '2018-08-25 18:00:00'::TIMESTAMPTZ;
為什麼 postgres 區分這兩種表示法?
因為,正如所記錄的,一個使用 POSIX,而另一個使用 ISO-8601。
要記住的另一個問題是,在 POSIX 時區名稱中,正偏移量用於格林威治以西的位置。在其他任何地方,PostgreSQL 都遵循 ISO-8601 約定,即正時區偏移量位於格林威治以東。