由于时区缩写没有得到很好的标准化,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 表示比格林尼治时间早 5 小时,或北美东海岸标准时间。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/
中的文件,则需要自己进行备份——常规数据库转储不会包含此目录。