因为时区简写的标准化程度并不高,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 偏移从未改变时,建议使用一个简单的整数 偏移
,因为这样的缩写名比需要咨询时区定义的缩写名更容易处理。
语法允许包含 @INCLUDE
.../share/timezonesets/
目录中的另一个文件。包含可以嵌套,但不能太深。
语法表示文件中的后续条目可以覆盖之前的条目(通常是从包含的文件中获取的条目)。如果不这样,则对同一个时间区缩写名的冲突定义将被视为错误。@OVERRIDE
在未经修改的版本中,文件 默认
包含世界上大多数非冲突时区缩写名。可为这些地区提供其他文件 澳大利亚
和 印度
:这些文件首先包含 默认
文件,然后根据需要添加或修改缩写名。
为了参考,标准版本还包含文件 非洲.txt
、美洲.txt
等,其中包含根据 IANA 时区数据库已知正在使用的每个时区缩写名的信息。可以在需要时将这些文件中找到的时区名称定义复制并粘贴到自定义配置文件中。请注意,由于这些文件名中包含句点,因此不能将这些文件直接引用为 timezone_abbreviations
设置。
在读取时区缩写名集时如果发生错误,则不应用任何新值,并保留旧集。如果在启动数据库时发生错误,则启动失败。
在配置文件中定义的时区缩写名将覆盖内置于 PostgreSQL 中的非时区含义。例如,
配置文件定义 澳大利亚
SAT
(代表南澳大利亚标准时间)。当这个文件处于活动状态时,
将不会被识别为周六的缩写名。SAT
如果你修改 .../share/timezonesets/
中的文件,则有责任进行备份——正常的数据库转储不会包含此目录。