受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

B.4. 日期/时间配置文件 #

由于时区缩写缺乏良好的标准化,PostgreSQL 提供了一种机制来自定义服务器可接受的缩写集合。 timezone_abbreviations 运行时参数决定当前活动的缩写集合。 虽然这个参数可以由任何数据库用户修改,但它的可能取值受数据库管理员控制 — 它们实际上是安装目录中 .../share/timezonesets/ 里保存的配置文件名称。通过向该目录添加或修改文件,管理员可以为时区缩写设定本地策略。

如果文件名完全由字母组成,那么 timezone_abbreviations 可以被设置为 .../share/timezonesets/ 中找到的任意文件名。(禁止在 timezone_abbreviations 中使用非字母字符,不仅可以防止读取目标目录之外的文件,也能防止读取编辑器备份文件和其他无关文件。)

时区缩写文件可以包含空行和以 # 开头的注释。非注释行必须具有下列格式之一:

zone_abbreviation offset
zone_abbreviation offset D
zone_abbreviation time_zone_name
@INCLUDE file_name
@OVERRIDE

zone_abbreviation 就是正在定义的缩写。offset 是一个整数,给出相对 UTC 的秒数偏移;相对格林尼治以东为正,以西为负。例如,-18000 表示位于格林尼治以西五小时,也就是北美东海岸标准时间。D 表示该时区名称代表的是本地夏令时,而不是标准时间。

另一种写法是给出 time_zone_name,引用 IANA 时区数据库中定义的时区名称。这时会查阅该时区的定义,以判断该缩写是否正在或曾经在该时区使用过;如果是,就采用适当的含义,也就是:在所求时间戳对应时刻实际生效的含义;如果在那个时刻它并不是当时正在使用的含义,则采用紧接其前一个生效的含义;如果它只在那个时刻之后才被使用,则采用最早的含义。对于那些历史上含义曾发生变化的缩写,这种行为至关重要。也允许按一个并不出现该缩写的时区名称来定义某个缩写;这样使用该缩写就等同于直接写出该时区名称。

Tip

如果某个缩写相对 UTC 的偏移从未改变过,那么定义它时最好使用简单的整数 offset,因为这类缩写的处理成本远低于那些需要查阅时区定义的缩写。

@INCLUDE 语法允许包含 .../share/timezonesets/ 目录中的另一个文件。包含可以嵌套,但嵌套深度有限。

@OVERRIDE 语法表示文件中的后续条目可以覆盖先前条目(通常是从被包含文件中得到的条目)。如果没有它,同一个时区缩写的冲突定义会被视为错误。

在未经修改的安装中,Default 文件包含世界上大多数地区中所有互不冲突的时区缩写。另外还为澳大利亚和印度这两个地区提供了 AustraliaIndia 文件:这些文件会先包含 Default 文件,然后按需添加或修改缩写。

作为参考,标准安装还包含 Africa.txtAmerica.txt 等文件,其中包含 IANA 时区数据库中已知正在使用的每个时区缩写的信息。可以按需把这些文件中找到的时区名称定义复制并粘贴到自定义配置文件中。注意,这些文件不能直接作为 timezone_abbreviations 设置来引用,因为它们的名称中带有点号。

Note

如果在读取时区缩写集时发生错误,则不会应用新值,而会保留旧集合。如果该错误发生在数据库启动期间,则数据库启动会失败。

Caution

配置文件中定义的时区缩写会覆盖 PostgreSQL 内置的非时区含义。例如,Australia 配置文件定义了 SAT(南澳大利亚标准时间)。当该文件处于活动状态时,SAT 将不会被识别为 Saturday 的缩写。

Caution

如果你修改了 .../share/timezonesets/ 中的文件,就需要自行做好备份 — 普通的数据库转储不会包含这个目录。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。