2024 年 9 月 26 日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:开发版
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4

B.2. 处理无效或模棱两可的时间戳 #

通常,如果日期/时间字符串在语法上有效,但包含范围外的字段值,则会抛出错误。例如,指定 2 月 31 日的输入将被拒绝。

在夏令时转换期间,看似有效的时间戳字符串可能代表一个不存在或模棱两可的时间戳。这些情况不会被拒绝;通过确定要应用哪个 UTC 偏移量来解决歧义。例如,假设 TimeZone 参数设置为 America/New_York,请考虑

=> SELECT '2018-03-11 02:30'::timestamptz;
      timestamptz
------------------------
 2018-03-11 03:30:00-04
(1 row)

由于那天是该时区的春季前移转换日期,因此没有民用时间 2:30AM;时钟从 2AM EST 跳到 3AM EDT。 PostgreSQL 将给定时间解释为标准时间(UTC-5),然后呈现为 3:30AM EDT(UTC-4)。

相反,考虑秋季后退转换期间的行为

=> SELECT '2018-11-04 01:30'::timestamptz;
      timestamptz
------------------------
 2018-11-04 01:30:00-05
(1 row)

在那一天,对 1:30AM 有两种可能的解释;有一个 1:30AM EDT,然后在时钟从 2AM EDT 跳回 1AM EST 后一个小时,就有了 1:30AM EST。同样,PostgreSQL 将给定时间解释为标准时间(UTC-5)。我们可以通过指定夏令时来强制进行另一种解释

=> SELECT '2018-11-04 01:30 EDT'::timestamptz;
      timestamptz
------------------------
 2018-11-04 01:30:00-04
(1 row)

在这种情况下适用的精确规则是,似乎落在夏令时前移转换范围内的无效时间戳将被分配到转换前在时区中生效的 UTC 偏移量,而可能落在后退转换任一侧的模棱两可的时间戳将被分配到转换后生效的 UTC 偏移量。在大多数时区中,这相当于说 在有疑问的情况下,标准时间解释优先

在所有情况下,都可以使用数字 UTC 偏移量或对应于固定 UTC 偏移量的时间区缩写显式指定与时间戳关联的 UTC 偏移量。只有在需要为偏移量可变的时区推断 UTC 偏移量时,才会应用上面给出的规则。

提交更正

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