Postgres 在解析时区时表现出一些奇怪的行为,或者我只是不明白它是如何工作的。
从文档中:
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST'; Result: 2001-02-16 18:38:40
该示例采用 EST (UTC-5) 中指定的时间戳并将其转换为 MST (UTC-7) 中的本地时间。
这似乎暗示 'MST' 可以与 'UTC-7' 互换,但行为与您的预期相反。
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'UTC-7';
Result: 2001-02-17 08:38:40
不是使用时区“UTC-7”,而是使用“UTC+7”,相差 14 小时。
使用 ISO 8601 时区表示法也会产生与预期结果相反的结果:
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE '-7';
Result: 2001-02-17 08:38:40
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE '-07';
Result: 2001-02-17 08:38:40
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE '-07:00';
Result: 2001-02-17 08:38:40
唯一引发错误的 ISO 8601 符号是-0700
符号。
接受其他乱码符号,即使它们根本没有任何意义:
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE '-7MST';
Result: 2001-02-17 08:38:40
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST-7';
Result: 2001-02-17 08:38:40
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE '-7+7';
Result: 2001-02-17 08:38:40
有人可以帮助我了解时区,特别是偏移符号如何在 Postgres 中工作或应该工作。
不是使用时区“UTC-7”,而是使用“UTC+7”,相差 14 小时。
这取决于 +/- 是指格林威治以东还是以西,事实证明这两种约定都存在。PostgreSQL 文档对此提出警告:
http://www.postgresql.org/docs/current/static/datatype-datetime.html
摘自8.5.3。时区(但您真的想阅读整个段落):
使用 ISO 8601 时区表示法也会产生与预期结果相反的结果:
在同一页面中,列出了时区文字的可接受格式,这是一个精简版本:
请注意,它从不假装接受 ISO 8601 时区指示符。正如您发现的那样
-0700
,事实并非如此。您应该只使用上述表格之一。还要注意(错误的)结论,因为解析器不拒绝时区,所以它是有效的: