支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5

B.5. POSIX时区规范 #

PostgreSQL 可以接受根据POSIX标准中 TZ 环境变量规则编写的时区规范。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 可以有一位或两位数字;mmss(如果使用)必须有两位数字。

夏令时转换 rule 的格式如下

dstdate [ / dsttime ] , stddate [ / stdtime ]

(和之前一样,实际上不应包含空格。)dstdatedsttime 字段定义夏令时开始的时间,而 stddatestdtime 定义标准时间开始的时间。(在某些情况下,特别是在赤道以南的时区,前者可能比后者晚一年。)日期字段具有以下格式之一

n

一个纯整数表示一年中的某一天,从 0 计数到 364,或在闰年中计数到 365。

Jn

在这种形式中,n 从 1 计数到 365,即使存在 2 月 29 日也不计算在内。(因此,无法通过这种方式指定 2 月 29 日发生的转换。但是,2 月之后的日子无论是否是闰年都具有相同的数字,因此对于固定日期的转换,此形式通常比纯整数形式更有用。)

Mm.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 年的美国惯例(即,在三月的第二个星期日向前拨快时间,在十一月的第一个星期日向后拨慢时间,两次转换均发生在当地时间凌晨 2 点)。请注意,此规则不提供 2007 年之前的年份的正确美国转换日期。

例如,CET-1CEST,M3.5.0,M10.5.0/3 描述了巴黎当前的(截至 2020 年)计时惯例。此规范表示标准时间具有缩写 CET 并且比 UTC 早(东)一个小时;夏令时具有缩写 CEST 并且隐含地比 UTC 早两个小时;夏令时在三月的最后一个星期日凌晨 2 点 CET 开始,在十月的最后一个星期日凌晨 3 点 CEST 结束。

四个时区名称 EST5EDTCST6CDTMST7MDTPST8PDT 看起来像是 POSIX 时区规范。但是,它们实际上被视为命名的时区,因为(由于历史原因)在 IANA 时区数据库中存在这些名称的文件。这实际上意味着这些时区名称将产生有效的美国历史夏令时转换,即使普通的 POSIX 规范不会这样做。

应该注意的是,很容易拼写错误的 POSIX 样式时区规范,因为没有检查时区缩写是否合理。例如,SET TIMEZONE TO FOOBAR0 将会起作用,使系统实际上使用一个相当奇怪的 UTC 缩写。

提交更正

如果您发现文档中任何不正确、与您特定功能的使用体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。