将UTC时间戳转换为timestamptz

5

如何将UTC时间戳转换为timestamptz?

如果我的本地时区是GMT-1,并且我运行以下命令:

select '2017-01-01 00:00:00'::timestamptz

我会得到:

2017-01-01 00:00:00-01

但我想要的是:

2017-01-01 01:00:00-01


1
我知道这个帖子有点旧了,但其他人仍然会看到它……如果你是GMT-1,那意味着你向西移动,并且时间比UTC时间少一个小时(可以这么说)。所以你期望的输出难道不应该是2016-12-31 23:00:00-01吗? - Christoph
2个回答

12
更好的做法:
SELECT timestamp '2017-01-01 00:00:00' AT TIME ZONE 'UTC';
AT TIME ZONE构造之后不再需要任何其他的强制转换。它将返回timestamp with time zone(相当于timestamptz)对于timestamp without time zone(相当于timestamp)输入以及反之亦然。

对于给定的示例,提供时间戳常量的最短、最有效的方式是使用timestamp '2017-01-01'。或者使用一个转换,几乎与前者一样好:'2017-01-01'::timestamp。当缺失时,时间组件将被假定为00:00:00

"在UTC时区中的时间戳"这样的说法是不存在的。 timestamp没有任何时区信息。只有你知道它应该位于UTC时区。

类型名称“timestamp with time zone”有点误导。 timestamptz也不包含任何时区信息。给定的时区名称、缩写或偏移量用于计算相应的UTC时间。文本输出(显示)会根据您的会话设置调整到当前的时区。仅存储相应UTC时间的裸值。时区本身永远不会被存储。如果您需要它,请在另一列中额外存储。在您的特定情况下,UTC也恰好是用于输入的时区。

详细解释:


0
解决方案:select ('2017-01-01 00:00:00' at time zone 'utc')::timestamptz


这实际上是把时间往错误的方向移动了。(正如@Christoph指出的那样,问题中的示例2017-01-01 00:00:00在UTC时间下,即2017-01-01T00:00:00Z,实际上是2016-12-31 23:00:00-01 - Bruno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接