由于时区缩写并未标准化,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_abbreviation
offset
zone_abbreviation
offset
Dzone_abbreviation
time_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
将不会被识别为星期六的缩写。
如果您修改了 .../share/timezonesets/
中的文件,则需要自行备份——正常的数据库转储不包含此目录。
如果您在文档中发现任何不正确、与您对特定功能的实际体验不符或需要进一步澄清的内容,请使用 此表格 报告文档问题。