Postgresql没有正确转换时区

时间:2014-04-30 23:15:10

标签: postgresql timezone dst

我正在构建一个需要处理不同时区的应用程序,包括夏令时的时区。我使用Postgressql的时间戳和时区数据类型存储所有日期/时间,并且所有日期/时间都存储在UTC时区(我修改了postgresql.conf中的timezone条目)。

这是我创建的示例表:

CREATE TABLE category_city
(
category_city_id serial NOT NULL,
appt_start_time timestamp(0) with time zone,
appt_end_time timestamp(0) with time zone,
appt_days_of_week character varying,
CONSTRAINT category_city_pkey PRIMARY KEY (category_city_id )
);

我一直在使用'America \ Edmonton'时区测试一些转换。目前,此时区比UTC晚6个小时。我在此表中有一个时间戳,其值为1970-01-01 15:00:00+00

现在我执行此查询:

SELECT appt_start_time at time zone 'America/Edmonton' as start
FROM category_city 

这个应该给我时间戳1970-01-01 09:00:00+00,但它给了我时间戳1970-01-01 08:00:00+00,偏移量为-7。这不是DST时的正确偏移量,但现在显然不正确(DST生效)。

我必须遗漏一些东西,因为我确信我不是唯一一个需要用DST处理不同时区的人。

我服务器上的时间是正确的,这是Ubuntu上date命令的输出:

Wed Apr 30 17:11:59 MDT 2014

任何人都可以看到我忽略的东西,或者有任何经验相似的东西,并找到解决方法吗?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

1970-01-01 09:00:00+00时区'America/Edmonton'的时间1970-01-01 08:00:00 ,无论您何时提出。如果您想要特定时区的时间,您需要明确说明:

select '1970-01-01 15:00:00+00' at time zone 'MST' as start;
        start        
---------------------
 1970-01-01 08:00:00

select '1970-01-01 15:00:00+00' at time zone 'MDT' as start;
        start        
---------------------
 1970-01-01 09:00:00

我想上面很容易看出为什么MDT时区的时间总是一样的。