由于时区缩写没有很好的标准化,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/
中的文件,则应自行创建备份——正常的数据库转储不包含此目录。
如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用 此表单 报告文档问题。