PostgreSQL 可以接受根据以下规则编写的时区规范POSIXTZ
环境变量的标准。POSIXPOSIX 时区规范不足以处理现实世界中时区历史的复杂性,但有时有理由使用它们。
POSIX 时区规范的形式如下:
STD
offset
[DST
[dstoffset
] [ ,rule
] ]
(为了便于阅读,我们在字段之间显示空格,但实际上不应使用空格。)字段是
STD
是用于标准时间的时区缩写。
offset
是该时区与 UTC 的标准时间偏移量。
DST
是用于夏令时的时区缩写。如果省略此字段和以下字段,则该时区使用固定的 UTC 偏移量,不包含夏令时规则。
dstoffset
是夏令时与 UTC 的偏移量。此字段通常省略,因为它默认为比标准时间 offset
小一个小时,这通常是正确的。
rule
定义夏令时生效的规则,如下所述。
在此语法中,时区缩写可以是字母字符串,例如 EST
,也可以是带尖括号的任意字符串,例如 <UTC-05>
。请注意,此处给出的时区缩写仅用于输出,即使在某些时间戳输出格式中也是如此。时间戳输入中识别的时区缩写如 第 B.4 节中所述确定。
偏移量字段指定与 UTC 的小时差,以及可选的分钟和秒差。它们的格式为 hh
[:
mm
[:
ss
]],可选带有前导符号(+
或 -
)。正号用于格林威治以西的时区。(请注意,这与 PostgreSQL 中其他地方使用的 ISO-8601 符号约定相反。)hh
可以有一位或两位数字;mm
和 ss
(如果使用)必须有两位数字。
夏令时转换 rule
的格式为:
dstdate
[/
dsttime
],
stddate
[/
stdtime
]
(和之前一样,实际上不应包含空格。)dstdate
和 dsttime
字段定义夏令时何时开始,而 stddate
和 stdtime
定义标准时间何时开始。(在某些情况下,尤其是在赤道以南的地区,前者可能比后者晚一年。)日期字段具有以下格式之一:
n
一个普通整数表示一年中的某一天,从零数到 364,或者在闰年中数到 365。
J
n
在这种形式中,n
从 1 数到 365,即使存在 2 月 29 日也不计算在内。(因此,不能以这种方式指定发生在 2 月 29 日的转换。但是,2 月之后的日期无论是否是闰年,都具有相同的数字,因此对于固定日期上的转换,此形式通常比普通整数形式更有用。)
M
m
.
n
.
d
此形式指定在同一个月份和同一星期几始终发生的转换。m
表示月份,从 1 到 12。n
指定由 d
标识的星期几的第 n
次出现。n
是一个介于 1 到 4 之间的数字,或者 5 表示该星期几在该月的最后一次出现(可能是第四次或第五次)。d
是一个介于 0 到 6 之间的数字,其中 0 表示星期日。例如,M3.2.0
表示 “三月的第二个星期日”。
M
格式足以描述许多常见的夏令时转换规则。但请注意,这些变体都无法处理夏令时法律变更,因此实际上,存储在命名时区(在 IANA 时区数据库中)中的历史数据对于正确解释过去的时间戳是必要的。
转换规则中的时间字段的格式与先前描述的偏移量字段相同,只是它们不能包含符号。它们定义更改为其他时间时发生的当前本地时间。如果省略,则默认为 02:00:00
。
如果给出了夏令时缩写,但省略了转换 rule
字段,则回退行为是使用规则 M3.2.0,M11.1.0
,这与 2020 年的美国惯例相对应(即,在三月的第二个星期日向前拨快,在 11 月的第一个星期日向后拨慢,两次转换都发生在凌晨 2 点的现行时间)。请注意,此规则未给出 2007 年之前的美国正确转换日期。
例如,CET-1CEST,M3.5.0,M10.5.0/3
描述了巴黎当前(截至 2020 年)的计时惯例。此规范表示标准时间的缩写为 CET
,比 UTC 早(东)一个小时;夏令时的缩写为 CEST
,隐式比 UTC 早两个小时;夏令时在三月的最后一个星期日凌晨 2 点 CET 开始,在 10 月的最后一个星期日凌晨 3 点 CEST 结束。
四个时区名称 EST5EDT
、CST6CDT
、MST7MDT
和 PST8PDT
看起来像是 POSIX 时区规范。但是,由于(历史原因)IANA 时区数据库中存在这些名称的文件,因此它们实际上被视为命名时区。这实际的含义是,这些时区名称将产生有效的美国历史夏令时转换,即使普通的 POSIX 规范不会。
应该注意的是,很容易拼错 POSIX 样式的时区规范,因为没有检查时区缩写是否合理。例如,SET TIMEZONE TO FOOBAR0
将会工作,从而使系统有效地使用一个相当特殊的 UTC 缩写。
如果您在文档中发现任何不正确、与您特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。