Vil*_*uss 4 postgresql timezone
Postgres 在解析时区时表现出一些奇怪的行为,或者我只是不明白它是如何工作的。
从文档:
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
它没有使用时区“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
Run Code Online (Sandbox Code Playgroud)
唯一引发错误的 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
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我了解时区,特别是偏移表示法在 Postgres 中是如何工作的,或者应该是如何工作的。
它没有使用时区“UTC-7”,而是使用时区“UTC+7”,相差 14 小时。
这取决于 +/- 是指格林威治以东还是以西,事实证明这两种约定都存在。PostgreSQL 文档对此发出警告:
http://www.postgresql.org/docs/current/static/datatype-datetime.html
摘自8.5.3。时区(但你真的很想阅读整段):
要记住的另一个问题是,在 POSIX 时区名称中,格林威治以西的位置使用正偏移量。在其他任何地方,PostgreSQL 都遵循 ISO-8601 约定,即正时区偏移位于格林威治以东。
使用 ISO 8601 时区符号也会产生与预期结果相反的结果:
在同一页面中,列出了接受的时区文字格式,这是一个精简版本:
PostgreSQL 允许您以三种不同的形式指定时区:
完整的时区名称,例如 America/New_York [...]
时区缩写,例如 PST[...]
除了时区名称和缩写,PostgreSQL 将接受形式为 STDoffset 或 STDoffsetDST 的 POSIX 风格的时区规范,其中 STD 是区域缩写,offset 是从 UTC 向西以小时为单位的数字偏移量,而 DST 是可选的日光-储蓄区缩写,[...]
请注意,它从不假装接受 ISO 8601 时区指示符。正如你发现的那样-0700
,它没有。您应该只使用上述表格之一。
还要注意(错误的)结论,因为解析器不拒绝时区,它是有效的:
应该警惕 POSIX 风格的时区特性可能会导致默默接受虚假输入,因为没有检查时区缩写的合理性