PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

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

由于时区缩写没有很好地标准化, PostgreSQL 提供了一种方法来自定义日期 时间输入所接受的缩写集合。 这些缩写有两个来源:

  1. TimeZone 运行时参数通常被设为 IANA 时区 数据库中某个条目的名称。 如果该时区有被广泛使用的时区缩写,它们会出现在 IANA 数据中, 并且 PostgreSQL 将优先按 IANA 数据 给定的含义识别这些缩写。 例如,如果 timezone 被设 为 America/New_York,那么 EST 会被理解为 UTC-5,而 EDT 会被理解为 UTC-4。(如果 DateStyle 被设为偏好非数字 时区缩写的样式,这些 IANA 缩写也会被用在日期时间输出中。)

  2. 如果在当前 IANA 时区中找不到某个缩写,就会在 timezone_abbreviations 运行时参数指定的 列表中查找它。 timezone_abbreviations 列表的主要用途是让 日期时间输入能够识别当前时区之外的其他时区的缩写。 (这些缩写不会用于日期时间输出。)

虽然 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 包含世界上 大部分地区所有互不冲突的时区缩写。 另外还提供了适用于特定地区的文件 Australia 和 India:这些文件首先包含 Default 文件,然后按需添加或修改缩写。

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

Note

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

Caution

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

Caution

如果您修改了 .../share/timezonesets/ 中的 文件,备份要由您自己负责 — 普通的数据库转储不会包含这个 目录。