Postgres AT TIME ZONE 函数显示错误的时间?

kad*_*kaz 5 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';
Run Code Online (Sandbox Code Playgroud)

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

结果是

"2015-01-13 04:40:00",
"2015-01-13 10:40:00"
Run Code Online (Sandbox Code Playgroud)

为什么?

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

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

SMA*_*MAG 8

从 Postgres文档中可以选择使用::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'
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

  • SELECT created_at AT TIME ZONE 'UTC' AT TIME ZONE 'America/Mexico_City',这给了我正确的结果。谢了,兄弟! (2认同)

And*_*cev 2

拼写为“UTC+3:00”的时区名称是 POSIX 时区规范。在这种风格中,GMT 以西的区域名称中带有正号,而以东的区域名称中带有负号(例如“Etc/GMT-14”是 GMT 之前/以东 14 小时。)

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