选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本的对应页面,或其他在上面列出的活跃大版本。

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/ 中的文件,就需要自行做好备份 — 普通的数据库转储不会包含这个目录。