我有一列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时区类型的误解。就是说,谢谢您的教育!
答案 0 :(得分:0)
表达式timezone('America/Denver', starts_at)
将starts_at
解释为丹佛当地时间,结果为timestamp with time zone
。
现在,当您输出该值时,它将转换为您的会话时区,即UTC。
在丹佛的13:05在UTC是19:05,这恰好是您的会话时区。
在夏令时期间,丹佛与世界标准时间(UTC)相距6小时。