【问题标题】:Postgresql not converting timezone correctlyPostgresql 没有正确转换时区
【发布时间】:2014-06-17 10:59:21
【问题描述】:

我正在构建一个需要处理不同时区的应用程序,包括具有夏令时的时区。我使用 Postgressql 的时间戳和 timezone 数据类型存储所有日期/时间,并且所有日期/时间都存储在 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

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

【问题讨论】:

    标签: postgresql timezone dst


    【解决方案1】:

    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 时区的那个时间总是一样的。

    【讨论】:

    • @Denis 好的,我只是复制,没有注意。
    • 是的,当我试图理解这个问题时,我想通了。
    • 这很有意义。我觉得我忽略了这样的事情很愚蠢,哈哈。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 2012-05-06
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多