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

spo*_*boy 9 postgresql

我需要在某个时区(例如'Etc/UTC')将表示没有时区(即"2017-03-08T20:53:05")的时间戳的字符串转换为带有时区的时间戳.

问题是默认时区不是'Etc/UTC'.所以,当我想要的时候

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

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

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

谢谢.

更新:我已检查上述声明是否真的有效.

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

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

Seg*_*ult 12

您可以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';
Run Code Online (Sandbox Code Playgroud)

这会解决您的问题吗?


Mag*_*ena 8

:timestamp without time zone 不需要,只需:

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


小智 8

就我而言,这成功了(感谢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'
Run Code Online (Sandbox Code Playgroud)


The*_*Pea 8

我的问题与 OP 的问题不同。我的字符串已经知道它的时区。我只想转换为timestamptz数据类型。

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

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

  • 对于那些处理非 ISO 格式日期时间的人,可以使用类似这样的``select to_timestamp('20/01/2021 08:58:42+7', 'DD/MM/YYYY HH24:MI:SSTZH'): :时间戳;``` (4认同)

sha*_*jji 7

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

Select current_setting('timezone');

就我而言 Asia/Karachi

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

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

就我而言。

Select Cast('1990-01-25' as Date) at time zone 'Asia/Karachi' at time zone 'utc';
Run Code Online (Sandbox Code Playgroud)