Postgresql

為什麼 postgresql 區分命名時區符號和數字時區符號?

  • August 26, 2018

為什麼命名時區和數字時區偏移量之間存在差異,兩者都會產生不同的 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 約定,即正時區偏移量位於格林威治以東。

引用自:https://dba.stackexchange.com/questions/215877