Postgres AT TIME ZONE功能显示错误的时间?

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

我正在使用转换到新的时区UTC + 3,它等于EAT时区,但Postgres(9.1)显示错误的时间

select '2015-01-13 08:40:00.0'::timestamp with time zone AT TIME ZONE 'UTC+03', 
       '2015-01-13 08:40:00.0'::timestamp with time zone AT TIME ZONE 'EAT';

(默认时区是斯德哥尔摩)

结果是

"2015-01-13 04:40:00",
"2015-01-13 10:40:00"

为什么?

应该是2015-01-13 10:40:00

如果将JodaTime与两个时区一起使用,那么它会显示相同的正确结果'2015-01-13 10:40:00'。

postgresql timezone jodatime
3个回答
1
投票

拼写为“UTC + 3:00”的时区名称是POSIX时区规范。在这种风格中,格林威治标准时间以西的区域有一个正号,而东方区域的名称有一个负号(例如“Etc / GMT-14”比格林威治标准时间早14个小时/东部。)

http://www.postgresql.org/docs/9.3/static/datatype-datetime.html#DATATYPE-TIMEZONES


0
投票

我有类似的问题,它给了我错误的日期和时间,但这里的答案给了我一个明确的理解并解决了我的问题。 PostgreSQL wrong converting from timestamp without time zone to timestamp with time zone

所以我所做的就是改变

SELECT timestamp AT TIME ZONE '+08' FROM orders;

SELECT timestamp AT TIME ZONE 'UTC' AT TIME ZONE '+08' FROM orders;

0
投票

从Postgres documentation可以选择使用::timestamptz而不是::timestamp WITH TIME ZONE,我在转换时找到了首选结果;因为它是可用选项中最简洁的,同时仍然可读。

SELECT created_at
      ,created_at::timestamp AT TIME ZONE 'EDT' -- yields bad result
      ,created_at::timestamp WITH TIME ZONE AT TIME ZONE 'EDT'
      ,created_at AT TIME ZONE 'UTC' AT TIME ZONE 'EDT'
      ,created_at::timestamptz AT TIME ZONE 'EDT'

2019-03-29 18:49:25.250431 -- raw UTC data
2019-03-29 22:49:25.250431 -- erroneous result  
2019-03-29 14:49:25.250431 -- accurate result    
2019-03-29 14:49:25.250431 -- accurate result   
2019-03-29 14:49:25.250431 -- accurate result
© www.soinside.com 2019 - 2024. All rights reserved.