Postgres在解析时区时表现出一些奇怪的行为,或者我只是不明白它是如何工作的。
来自文档:
选择带有时区'2001-02-16 20:38:40-05‘AT时区’MST‘的时间戳;结果: 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中是如何工作的,或者应该如何工作吗?
发布于 2016-02-27 22:32:53
这取决于+/-意味着格林威治的东部还是西部,而且这两种惯例都存在。PostgreSQL医生警告说:
http://www.postgresql.org/docs/current/static/datatype-datetime.html
摘录自8.5.3。时区(但您确实想阅读整个段落):
另一个要记住的问题是,在POSIX时区名称中,格林威治以西的位置使用正偏移。在其他地方,PostgreSQL遵循的是在格林威治以东有积极时区抵消的ISO-8601公约。
使用ISO8601时区表示法的
在同一页中,列出了时区文字的可接受格式,下面是一个精简版本:
PostgreSQL允许您以三种不同的形式指定时区:
请注意,它从不假装接受ISO 8601时区指示符。正如您在-0700中发现的那样,它没有,您应该使用上面的表单之一。
还要注意(false)结论,因为解析器不拒绝某个时区,所以它是有效的:
人们应该注意,POSIX风格的时区功能可能导致默默接受虚假输入,因为没有检查区域缩写的合理性。
https://dba.stackexchange.com/questions/130546
复制相似问题