【发布时间】:2017-02-12 11:20:44
【问题描述】:
在我的 postgresql.conf 文件中,我的默认时区设置为“欧洲/伦敦”。
由于 DST 将于 10 月 30 日关闭,这意味着现在(我正在写作时是 10 月 4 日)“欧洲/伦敦”should correspond 和“+01”。
我有一个dummy 表,其中time 列是timestamp with timezone 类型。
Postgres specs 声明:
对于
timestamp with timezone,内部存储的值始终采用 UTC(通用协调时间,传统上称为格林威治标准时间,GMT)。使用该时区的适当偏移量将具有指定明确时区的输入值转换为 UTC。 如果输入字符串中没有说明时区,则假定它在系统的 TimeZone 参数指示的时区,并使用时区的偏移量转换为 UTC。
至于粗体句,如果我这样插入:
INSERT INTO dummy VALUES ('2016-12-25 12:00:00.000')
我希望它被解释为“欧洲/伦敦”时区,因此'2016-12-25 12:00:00.000+01'。
因此,当我检索它时,我希望显示该值(或者,至少是等效的 '2016-12-25 11:00:00.000+00')。
相反,如果我进行查询
SELECT * FROM dummy
我收到了这个:
|time |
|timestamp with time zone|
--------------------------
|2016-12-25 12:00:00+00 |
我无法理解这种行为的原因。 “欧洲/伦敦”时区的 DST 管理是否错误?我错过了什么吗?
如果我切换到任何其他时区,它总是按预期工作。
【问题讨论】:
-
你的意思是当我尝试使用不同的时区时?我刚刚使用
SET TIME ZONE命令在会话级别更改了tz。 -
@DanieleRepici 您的期望不完整,Postgres 将假定
timestamptz '2016-12-25 12:00:00.000 Europe/London',确实是2016-12-25 12:00:00+00(即Postgres 将使用时区,而不是当前的偏移量)。 -
@pozs 所以基本上你是说在这种情况下它没有考虑当前时间来推断正确的偏移量。这种行为是否在某处指定?至于引用文档中的粗体句,为了进行转换,Postgres 应该问自己:“好的,时区 'Europe/London' 的偏移量是多少?”这确实取决于当前时间。
-
@DanieleRepici 是的。每当 Postgres 文档引用 timezone 时,它表示一个时区,它可能包含也可能不包含 DST 规则。如果是这样,它将始终考虑在内。您也可以将显式偏移设置为时区:那么它将永远不会使用 DST 规则。文档的Time Zones section 可以进一步澄清这一点。
标签: postgresql timestamp-with-timezone