支持的版本: 当前 (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 AM;时钟从美国东部时间 2 AM 跳到美国东部夏令时间 3 AM。 PostgreSQL 将给定的时间解释为好像它是标准时间 (UTC-5),然后呈现为美国东部夏令时间 3:30 AM (UTC-4)。

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

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

在那天,对 1:30 AM 有两种可能的解释;有 1:30 AM EDT,然后在一个小时后,当时间从 2 AM EDT 跳回到 1 AM EST 后,又有 1:30 AM 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 偏移量的情况。

提交更正

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