由於時區縮寫並未標準化,PostgreSQL 提供了一種方法來定製日期時間輸入中可接受的縮寫集。這些縮寫有兩種來源:
通常,TimeZone 執行時引數設定為 IANA 時區資料庫中某個條目的名稱。如果該時區有廣泛使用的時區縮寫,它們將出現在 IANA 資料中,並且 PostgreSQL 將優先識別這些縮寫,並賦予其 IANA 資料中指定的含義。例如,如果 timezone
設定為 America/New_York
,那麼 EST
將被理解為 UTC-5,EDT
將被理解為 UTC-4。(如果 DateStyle 設定為偏好非數字時區縮寫的樣式,這些 IANA 縮寫也將用於日期時間輸出。)
如果當前 IANA 時區中找不到某個縮寫,則會在 timezone_abbreviations 執行時引數指定的列表中查詢。 timezone_abbreviations
列表主要用於允許日期時間輸入識別當前時區之外的時區縮寫。(這些縮寫不會用於日期時間輸出。)
雖然 timezone_abbreviations
引數可以被任何資料庫使用者修改,但其可能的值由資料庫管理員控制——實際上它們是安裝目錄中 .../share/timezonesets/
中儲存的配置檔名稱。透過在該目錄中新增或修改檔案,管理員可以設定本地時區縮寫的策略。
timezone_abbreviations
可以設定為 .../share/timezonesets/
中找到的任何檔名,前提是該檔案的名稱完全由字母組成。(禁止在 timezone_abbreviations
中使用非字母字元,是為了防止讀取該目錄之外的檔案,以及讀取編輯器備份檔案和其他無關檔案。)
時區縮寫檔案可以包含空行以及以 #
開頭的註釋。非註釋行必須符合以下格式之一:
zone_abbreviation
offset
zone_abbreviation
offset
Dzone_abbreviation
time_zone_name
@INCLUDEfile_name
@OVERRIDE
一個 zone_abbreviation
是正在定義的縮寫。一個 offset
是一個整數,表示與 UTC 的偏移秒數,正數表示在格林威治以東,負數表示在格林威治以西。例如,-18000 表示比格林威治晚五個小時,或北美東海岸標準時間。D
表示該時區名稱代表本地夏令時而非標準時間。
或者,也可以提供一個 time_zone_name
,引用 IANA 時區資料庫中定義的時區名稱。將查閱該時區的定義,以確定該縮寫是否或曾經在該時區中使用過,如果是,則使用適當的含義——即,在正在確定值的那個時間戳點上當前使用的含義,如果當時不是當前使用的,則使用在此之前立即使用的含義,如果只在此之後使用過,則使用最古老的含義。這種行為對於處理含義隨歷史變化的縮寫至關重要。也可以定義一個縮寫,使其等同於一個不包含該縮寫的時區名稱;在這種情況下,使用該縮寫就等同於寫出該時區名稱。
當定義一個其與 UTC 的偏移量從未改變過的縮寫時,首選使用簡單的整數 offset
,因為處理這種縮寫的成本比需要查詢時區定義的縮寫要低得多。
@INCLUDE
語法允許包含 .../share/timezonesets/
目錄中的另一個檔案。包含可以巢狀,但有一定深度限制。
@OVERRIDE
語法表示檔案中後續的條目可以覆蓋之前的條目(通常是從包含的檔案中獲得的條目)。如果沒有這個設定,同一時區縮寫的衝突定義將被視為錯誤。
在未修改的安裝中,Default
檔案包含了世界大部分地區所有非衝突的時區縮寫。還為這些地區提供了額外的檔案 Australia
和 India
:這些檔案首先包含 Default
檔案,然後根據需要新增或修改縮寫。
為方便參考,標準安裝還包含 Africa.txt
、America.txt
等檔案,其中包含根據 IANA 時區資料庫已知的每個時區縮寫的資訊。這些檔案中找到的時區名稱定義可以根據需要複製並貼上到自定義配置檔案中。請注意,由於檔名中包含點(.),這些檔案不能直接作為 timezone_abbreviations
設定進行引用。
如果在讀取時區縮寫集時發生錯誤,將不會應用新值,而是保留舊的縮寫集。如果錯誤發生在資料庫啟動時,則啟動失敗。
配置檔案中定義的天氣時區縮寫會覆蓋 PostgreSQL 內建的非時區含義。例如,Australia
配置檔案定義了 SAT
(代表南澳大利亞標準時間)。當此檔案生效時,SAT
將不會被識別為星期六的縮寫。
如果您修改了 .../share/timezonesets/
中的檔案,則需要自行備份——正常的資料庫轉儲不包含此目錄。
如果您在文件中發現任何不正確、與您對特定功能的實際體驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。