如何将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
如何将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
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也恰好是用于输入的时区。
详细解释:
select ('2017-01-01 00:00:00' at time zone 'utc')::timestamptz
2017-01-01 00:00:00
在UTC时间下,即2017-01-01T00:00:00Z
,实际上是2016-12-31 23:00:00-01
) - Bruno