由于时区缩写没有很好的标准化,PostgreSQL 提供了一种自定义服务器接受的缩写集的方法。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/
中的文件,则需要自行备份 — 正常的数据库转储将不包含此目录。
如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用此表格报告文档问题。