如何将字符串转换为所需时区中的时间戳

时间:2017-03-09 00:04:06

标签: postgresql

我需要转换一个代表没有时区的时间戳的字符串(即" 2017-03-08T20:53:05") 在某个时区(例如,' Etc / UTC')到具有时区的时间戳。

问题是默认时区不是' Etc / UTC'。所以,当我试图

SELECT to_timestamp(field1, 'YYYY-MM-DD hh24:mi:ss')::timestamp without time zone at time zone 'Etc/UTC'

它将字符串转换为具有默认时区的值,然后将转换从本地时区应用到' Etc / UTC'。这不是所要求的。

基本上,我正在寻找一种方法告诉postgres原始字符串值表示特定时区的时间,而不是默认的本地时间。

谢谢。

更新:我已检查过上述声明是否有效。

SELECT to_timestamp(field1, 'YYYY-MM-DD hh24:mi:ss')::timestamp without time zone at time zone 'Etc/UTC'

我被客户的时区设置误导了。

5 个答案:

答案 0 :(得分:11)

您可以在查询之前运行set time zone UTC;

set time zone UTC;
SELECT to_timestamp(field1, 'YYYY-MM-DD hh24:mi:ss')::timestamp without time zone at time zone 'Etc/UTC';

这会解决您的问题吗?

答案 1 :(得分:7)

不需要

:timestamp without time zone,只需:

SELECT to_timestamp(field1, 'YYYY-MM-DD hh24:mi:ss') at time zone 'Etc/UTC'

答案 2 :(得分:2)

我的需要不同于OP。我的字符串已经知道其时区。我只想转换为timestamptz数据类型。

换句话说:“如何将所需时区中的字符串转换为时间戳”。我可以使用描述的方法herehere;使用::timestamptz

进行投射

SELECT '2016-01-01 00:00+10'::timestamptz;

答案 3 :(得分:1)

在我的情况下,这可以解决问题(感谢shajji的回答)

to_timestamp(:date, 'YYYY-MM-DD"T"HH24:MI:SS:MS"Z"') at time zone (select current_setting('timezone')) at time zone 'Etc/UTC'

答案 4 :(得分:0)

首先找到您的默认时区。通过使用以下查询。

Select current_setting('timezone');

在我的情况下,Asia/Karachi

k,现在只需尝试以下查询即可。

Select Cast('1990-01-25' as Date) at time zone '<Your Default Timezone>' at time zone 'utc';

就我而言。

Select Cast('1990-01-25' as Date) at time zone 'Asia/Karachi' at time zone 'utc';