首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres中奇怪的UTC偏移时区解析

Postgres中奇怪的UTC偏移时区解析
EN

Database Administration用户
提问于 2016-02-26 09:00:43
回答 1查看 1.8K关注 0票数 4

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’是可以互换的,但是这种行为与你所期望的正好相反。

代码语言:javascript
复制
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时区表示法也会产生与预期结果相反的结果:

代码语言:javascript
复制
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符号。

其他的胡言乱语也被接受了,尽管它们根本没有任何意义:

代码语言:javascript
复制
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中是如何工作的,或者应该如何工作吗?

EN

回答 1

Database Administration用户

回答已采纳

发布于 2016-02-27 22:32:53

不是使用时区'UTC-7‘,而是使用'UTC+7',这与’UTC+7‘不同。

这取决于+/-意味着格林威治的东部还是西部,而且这两种惯例都存在。PostgreSQL医生警告说:

http://www.postgresql.org/docs/current/static/datatype-datetime.html

摘录自8.5.3。时区(但您确实想阅读整个段落):

另一个要记住的问题是,在POSIX时区名称中,格林威治以西的位置使用正偏移。在其他地方,PostgreSQL遵循的是在格林威治以东有积极时区抵消的ISO-8601公约。

使用ISO8601时区表示法的

也产生与预期结果相反的结果:

在同一页中,列出了时区文字的可接受格式,下面是一个精简版本:

PostgreSQL允许您以三种不同的形式指定时区:

  • 全时区名称,例如美国/纽约...
  • 时区缩写,例如PST...。
  • 除了时区名称和缩写外,PostgreSQL还将接受STDoffset或STDoffsetDST形式的POSIX风格的时区规范,其中STD是区域的缩写,偏移量是以小时为单位的数字偏移量(以小时为单位),而DST是可选的夏时区缩写...。

请注意,它从不假装接受ISO 8601时区指示符。正如您在-0700中发现的那样,它没有,您应该使用上面的表单之一。

还要注意(false)结论,因为解析器不拒绝某个时区,所以它是有效的:

人们应该注意,POSIX风格的时区功能可能导致默默接受虚假输入,因为没有检查区域缩写的合理性。

票数 9
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/130546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档