Postgres "time zone at" 在转换时不遵守山地标准时间

Postgres "time zone at" isn't respecting mountain standard time when converting

我有一个类型为 TIMESTAMP WITHOUT TIME ZONE 的列 starts_at,因为它代表约会时间,不应在 DST 班次期间更改。

但是,我们处理重复约会的库这次需要 UTC 时间。我正在尝试将 starts_at 转换为 UTC,但发现我得到的时间表示 MDT(夏令时)而不是 MST(标准时间)。

例如,采取以下内容:

SELECT starts_at, timezone('America/Denver', starts_at) AS new_starts_at

我希望得到以下结果:

--------------------------------------------------
| starts_at              | new_starts_at
--------------------------------------------------
| 2018-09-04 13:05:00    |  2018-09-04 20:05:00+00

相反,我得到以下信息:

--------------------------------------------------
| starts_at              | new_starts_at
--------------------------------------------------
| 2018-09-04 13:05:00    |  2018-09-04 19:05:00+00

new_starts_at 应该会在 MST 中返回,也就是 2018-09-04 20:05:00+00。我的印象是,使用奥尔森时区 (America/Denver) 会通知 Postgres 是否存在 DST 转换。如果我将 America/Denver 替换为 MST,我会看到正确的结果。

我确定这只是我对 Postgres 时区类型的误解。话虽如此,在此先感谢您的教育!

表达式 timezone('America/Denver', starts_at)starts_at 解释为丹佛当地时间,结果是 timestamp with time zone.

现在,当您输出该值时,它会转换为您的会话时区,即 UTC。

丹佛的

13:05 是 UTC 的 19:05,这恰好是您的会话时区。

在夏令时期间,丹佛与 UTC 相差 6 小时。