由于时区缩写没有很好地标准化, PostgreSQL 提供了一种方法来自定义日期 时间输入所接受的缩写集合。 这些缩写有两个来源:
TimeZone 运行时参数通常被设为 IANA 时区
数据库中某个条目的名称。
如果该时区有被广泛使用的时区缩写,它们会出现在 IANA 数据中,
并且 PostgreSQL 将优先按 IANA 数据
给定的含义识别这些缩写。
例如,如果 timezone 被设
为 America/New_York,那么 EST
会被理解为 UTC-5,而 EDT 会被理解为
UTC-4。(如果 DateStyle 被设为偏好非数字
时区缩写的样式,这些 IANA 缩写也会被用在日期时间输出中。)
如果在当前 IANA 时区中找不到某个缩写,就会在
timezone_abbreviations 运行时参数指定的
列表中查找它。
timezone_abbreviations 列表的主要用途是让
日期时间输入能够识别当前时区之外的其他时区的缩写。
(这些缩写不会用于日期时间输出。)
虽然 timezone_abbreviations 参数
可以被任何数据库用户修改,但它的可能取值由数据库管理员控制
— 它们实际上是存放在安装目录
.../share/timezonesets/ 中的配置文件的
名称。通过添加或修改该目录中的文件,管理员可以设置本地关于时区
缩写的策略。
timezone_abbreviations 可以被设为
.../share/timezonesets/ 中找到的任何文件名,
只要文件名完全由字母组成。
(禁止
timezone_abbreviations 中出现非字母字符,可以
防止读取预期目录之外的文件,以及读取编辑器备份文件和其他无关
文件。)
时区缩写文件可以包含空行和以 # 开头的注释。
非注释行必须具有以下格式之一:
zone_abbreviationoffsetzone_abbreviationoffsetDzone_abbreviationtime_zone_name@INCLUDEfile_name@OVERRIDE
zone_abbreviation 就是正在定义的
缩写。offset 是一个整数,给出与 UTC
的等效偏移(以秒计),格林尼治以东为正、以西为负。
例如,-18000 表示格林尼治以西五小时,即北美东海岸标准时间。
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 将不会被识别为
Saturday 的缩写。
如果您修改了 .../share/timezonesets/ 中的
文件,备份要由您自己负责 — 普通的数据库转储不会包含这个
目录。