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

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

在夏时制过渡期间,看似有效的时间戳字符串可能表示不存在或不明确的时间戳。此类案件不予驳回;通过确定要应用哪个 UTC 偏移来解决歧义。例如,假设TimeZone参数设置为America/New_York,请考虑

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

由于该日期是该时区的 Spring 过渡日期,因此没有任何凌晨 2:30 AM。时钟从美国东部标准时间凌晨 2 点跳到美国东部时间凌晨 3 点。 PostgreSQL 将给定时间解释为标准时间(UTC-5),然后将其呈现为美国东部时间 3:30 AM EDT(UTC-4)。

相反,请考虑回退过渡期间的行为:

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

在那个日期,凌晨 2:30 有两种可能的解释:美国东部时间凌晨 2:30,然后恢复为标准时间一个小时后,美国东部标准时间凌晨 2:30.同样,PostgreSQL 将给定时间解释为标准时间(UTC-5)。我们可以通过指定夏令时来强制解决此问题:

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

此时间戳可以有效地呈现为 2:30 UTC-4 或 1:30 UTC-5;时间戳输出代码选择后者。

在这种情况下适用的精确规则是,将一个似乎落在向前夏时制过渡中的无效时间戳分配给该过渡之前的时区中普遍存在的 UTC 偏移,而可能会落在该时间戳上的模棱两可向后跳过渡的任一侧分配的是 UTC 偏移,该偏移恰好在过渡后出现。在大多数时区,这相当于说“有疑问时最好使用标准时间解释”。

在所有情况下,都可以使用数字 UTC 偏移量或对应于固定 UTC 偏移量的时区缩写来明确指定与时间戳关联的 UTC 偏移量。刚刚给出的规则仅在需要针对偏移量变化的时区推断 UTC 偏移量时适用。