转换时,Postgres的“时区位于”未遵守山区标准时间

时间:2018-11-21 20:42:35

标签: postgresql timestamp-with-timezone

我有一列starts_at,其类型为TIMESTAMP WITHOUT TIME ZONE,因为它代表约会的时间,在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。我的印象是使用Olsen时区(America/Denver)会通知Postgres是否已进行DST转换。如果我将America/Denver替换为MST,则会看到正确的结果。

我确定这只是我对Postgres时区类型的误解。就是说,谢谢您的教育!

1 个答案:

答案 0 :(得分:0)

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

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

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

在夏令时期间,丹佛与世界标准时间(UTC)相距6小时。