将UTC时间戳转换为timestamptz

问题描述 投票:0回答:2

如何将 UTC 格式的

timestamp
转换为
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

postgresql timezone timestamp
2个回答
13
投票

更好:

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时区。
类型名称“带时区的时间戳”有点误导。 

timestamptz

也不携带任何时区信息。给定的时区名称、缩写或偏移量用于计算相应的 UTC 时间。文本输出(显示)会根据您会话的当前时区设置进行调整。仅存储相应 UTC 时间的裸值。时区本身永远不会被存储。如果需要,请将其另外存储在另一列中。在您的特定情况下,UTC

碰巧
也是用于输入的时区。 详细说明:

  • 数据类型“带时区的时间戳”中的时区存储

  • 忽略 Postgres 时间戳的时区


0
投票
select ('2017-01-01 00:00:00' at time zone 'utc')::timestamptz

    

© www.soinside.com 2019 - 2024. All rights reserved.