Redrock Postgres 搜索 英文
版本: 11 / 12 / 13 / 14 / 15 / 16

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 偏移时,才应用刚刚给出的规则。