【发布时间】:2021-02-10 15:30:00
【问题描述】:
我有一张表,里面有几个时间戳列,基本如下:
timestamp_utc | timestamp
------------------------------------------------------------
'2020-10-28 08:00:00.000' | '2020-10-28 04:00:00.000'
我知道第一列是 UTC 时间,而第二列是纽约时间。我想知道如何添加相应的时区。所以我想要的结果是这样的:
timestamp_utc | timestamp
------------------------------------------------------------
'2020-10-28 08:00:00.000Z' | '2020-10-28 04:00:00.000-04'
我尝试过这样做:
>>> select timestamp_utc AT TIME ZONE 'UTC' from table;
'2020-10-28 04:00:00.000-04' /* wrong */
>>> select timestamp AT TIME ZONE 'EST' from table;
'2020-10-28 05:00:00.000-04' /* wrong, it should be 04:00:00 */
所以终于在纽约部分尝试了这个:
>>> select timestamp_est AT TIME ZONE 'America/New_York' from table;
'2020-10-28 04:00:00.000-04'
所以我认为当我添加带有位置的时区时,它可以工作。但是,当我尝试使用真正的时区时,除了添加时区之外,它还在转换时间?
【问题讨论】:
-
timestamp_utc和timestamp列的类型是什么(仅供参考,我会重命名它,或者您是否使用timestamp_est)?服务器的TimeZone设置是什么? -
列名只是虚拟的例子,所以如果它被称为时间戳也不用担心。 TimeZone 是 Est,但我无法更改服务器时区。通过使用 Python 而不是 PG 来解决它。正如@Laurenz Albe 所说,可能无法在 PG 中完成
-
我会在文档中查看这部分 Time Zones。它将帮助您了解正在发生的事情。提示您的
TimeZone未设置为EST。第二个EST实际上只是一个偏移量而不是一个完整的时区,因此您的转换会出错。最后,您将值存储为什么数据类型,timestamp 与 timestamptz 很重要。我一直在 Python 中使用dateutil,但它仍然取决于数据库中的底层行为。
标签: postgresql datetime timezone timestamp-with-timezone