2025年9月25日: PostgreSQL 18 釋出!
支援版本:當前18)/ 17 / 16 / 15 / 14 / 13
開發版本:devel
不支援版本:12 / 11 / 10 / 9.6 / 9.5

B.5。POSIX時區規範 #

PostgreSQL 可以接受根據POSIX標準關於 TZ 環境變數的規則編寫的時區規範。POSIX時區規範不足以處理真實世界時區歷史的複雜性,但有時有理由使用它們。

POSIX 時區規範具有以下形式

STD offset [ DST [ dstoffset ] [ , rule ] ]

(為了可讀性,我們在欄位之間顯示了空格,但在實際中不應使用空格。)欄位是

  • STD 是用於標準時間的時區縮寫。

  • offset 是該時區與 UTC 的標準時間偏移量。

  • DST 是用於夏令時的時區縮寫。如果省略此欄位及後續欄位,則該時區使用固定 UTC 偏移量,沒有夏令時規則。

  • dstoffset 是夏令時與 UTC 的偏移量。此欄位通常省略,因為它預設比標準時間 offset 少一小時,這通常是正確的做法。

  • rule 定義夏令時生效的規則,如下所述。

在此語法中,時區縮寫可以是字母字串,例如 EST,也可以是括在尖括號中的任意字串,例如 <UTC-05>。請注意,此處給出的時區縮寫僅用於輸出,而且僅在某些時間戳輸出格式中。時間戳輸入中識別的時區縮寫如 B.4 節中所述。

偏移欄位指定與 UTC 的小時,以及可選的分鐘和秒差異。它們的格式為 hh[:mm[:ss]],可選地帶有前導符號(+-)。正號用於格林威治西部的時區。(請注意,這與 PostgreSQL 中其他地方使用的 ISO-8601 符號約定相反。)hh 可以有一到兩位數字;mmss(如果使用)必須有兩位數字。

夏令時轉換 rule 具有以下格式

dstdate [ / dsttime ] , stddate [ / stdtime ]

(如前所述,實踐中不應包含空格。)dstdatedsttime 欄位定義夏令時開始的時間,而 stddatestdtime 定義標準時間開始的時間。(在某些情況下,特別是在赤道以南的時區,前者可能比後者晚。)日期欄位具有以下格式之一

n

一個純整數表示一年中的某一天,從 0 到 364,閏年為 365。

Jn

在這種形式中,n 從 1 數到 365,即使存在閏年,也不計算 2 月 29 日。(因此,無法以這種方式指定 2 月 29 日發生的轉換。然而,2 月份之後的日期在閏年或非閏年時數字相同,因此對於固定日期的轉換,這種形式通常比純整數形式更有用。)

Mm.n.d

這種形式指定了一種始終在同一月份和同一星期幾發生的轉換。m 標識月份,從 1 到 12。n 指定由 d 標識的星期幾的第 n 次出現。n 是一個介於 1 和 4 之間的數字,或者 5 表示該星期幾在該月份的最後一次出現(可能是第四次或第五次)。d 是一個介於 0 和 6 之間的數字,0 表示星期日。例如,M3.2.0 表示“三月的第二個星期日”。

注意

M 格式足以描述許多常見的夏令時轉換規則。但請注意,這些變體都無法處理夏令時法律變更,因此在實踐中,需要儲存在命名時區(在 IANA 時區資料庫中)的歷史資料才能正確解釋過去的時間戳。

轉換規則中的時間欄位與前面描述的偏移欄位格式相同,只是它們不能包含符號。它們定義了切換到另一個時間時當前的本地時間。如果省略,它們預設為 02:00:00

如果給出了夏令時縮寫但省略了轉換 rule 欄位,則回退行為是使用規則 M3.2.0,M11.1.0,這對應於 2020 年的美國做法(即,3 月的第二個星期日春季調快,11 月的第一個星期日秋季調回,兩次轉換都在當地時間凌晨 2 點發生)。請注意,此規則不提供 2007 年之前美國轉換日期的正確資訊。

例如,CET-1CEST,M3.5.0,M10.5.0/3 描述了巴黎當前(截至 2020 年)的時間保持實踐。此規範表示標準時間縮寫為 CET,比 UTC 快一小時(東);夏令時縮寫為 CEST,隱式比 UTC 快兩小時;夏令時於 3 月的最後一個星期日凌晨 2 點 CET 開始,並於 10 月的最後一個星期日凌晨 3 點 CEST 結束。

四個時區名稱 EST5EDTCST6CDTMST7MDTPST8PDT 看起來像是 POSIX 時區規範。然而,它們實際上被視為命名時區,因為(出於歷史原因)IANA 時區資料庫中存在以這些名稱命名的檔案。這實際意味著這些時區名稱將產生有效的歷史美國夏令時轉換,即使普通的 POSIX 規範不會。

應該警惕,POSIX 風格的時區規範很容易拼寫錯誤,因為沒有對時區縮寫合理性進行檢查。例如,SET TIMEZONE TO FOOBAR0 將起作用,使系統實際上使用了一個相當奇特的 UTC 縮寫。

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用此表單報告文件問題。