2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 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:30;时钟从东部标准时间 (EST) 凌晨 2 点向前跳到东部夏令时 (EDT) 凌晨 3 点。PostgreSQL 将给定时间解释为标准时间 (UTC-5),然后渲染为 EDT (UTC-4) 凌晨 3:30。

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

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

在那天,凌晨 1:30 有两种可能的解释;有 EDT 凌晨 1:30,然后一个小时后,时钟从 EDT 凌晨 2 点跳回到 EST 凌晨 1 点,有 EST 凌晨 1:30。同样,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 偏移量时,才适用上述规则。

提交更正

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