我正在构建一个需要处理不同时区的应用程序,包括夏令时的时区。我使用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
任何人都可以看到我忽略的东西,或者有任何经验相似的东西,并找到解决方法吗?任何帮助将不胜感激!
答案 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
时区的时间总是一样的。