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