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

时间:2015-01-14 08:48:38

标签: postgresql timezone jodatime

我正在使用转换到新的时区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'。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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;

答案 2 :(得分: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