首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用UCT值与时区名称时,为什么在postgresql中获得不同的值?

当使用UCT值与时区名称时,为什么在postgresql中获得不同的值?
EN

Stack Overflow用户
提问于 2022-04-27 23:18:26
回答 1查看 50关注 0票数 -1

如果我运行这个查询:

代码语言:javascript
复制
SELECT ('2021-11-02 08:00:00+00' AT TIME ZONE 'UCT') at TIME ZONE 'UCT+2';

它给出了这个结果:

2021-11-02 10:00:00+00

对我来说是正确的..。

但是,我的时区数据是字符串格式的,例如:“Africa/约翰内斯堡”,我知道它位于UCT+2时区。

但是,运行以下查询:

代码语言:javascript
复制
SELECT ('2021-11-02 08:00:00+00' AT TIME ZONE 'UCT') at TIME ZONE 'Africa/Johannesburg';

给出了这个结果:

2021-11-02 06:00:00+00

这与我所期望的正好相反。我知道我可以编写代码将字符串转换为UCT值,但我不明白为什么字符串值似乎与使用UCT值相反。有人能解释一下为什么会发生这种事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-28 00:54:35

哇,这里有很多东西要打开。

最主要的是(错误地引用Inigo ),我不认为UTC+2的意思是你认为它的意思。

这里一件重要的事情是精确的格式。

你说你得到了这个结果:

代码语言:javascript
复制
2021-11-02 06:00:00+00

但我得到的是:

代码语言:javascript
复制
2021-11-02 06:00:00

这真的很重要,因为我得到的并不包括那个+00。这是因为它仍然是08:00+00时区。

AT TIME ZONE语法是这样的:“在这个特定的UTC时间,本地用户会看到什么?”约翰内斯堡的人会把时间定在10点。在伦敦(冬天的时候)有人会认为它是06:00。但时间也是一样的瞬间。

因此,AT TIME ZONE的输出通常不包含来自UTC (+00)的时区偏移。

带有两个AT TIME ZONE子句的转换是多余的。因为它知道它在那个时区,因此它知道UCT时间是什么。使用一个AT TIME ZONE子句将得到相同的结果(尝试一下)。

您得到不同答案的原因似乎是因为PostgreSQL没有将UCT+2解释为比UCT提前2小时的TimeZone。当您指定POSIX时区定义时,它会对此进行解释,该定义还可以包括夏时制规则等。

此页面:https://www.postgresql.org/docs/current/datatype-datetime.html表示PostgreSQL将接受以下三种方式指定的时区:

  • 全名。'Africa/Johannesburg'
  • Abbreviation --G.‘e.g.’
  • Posix格式。‘’CET 1 1CEST,M3.5.0,M10.5.0/3‘(这显然是巴黎)

实际上,它不包括Posix格式的示例,这个页面上的示例是:https://www.postgresql.org/docs/current/datetime-posix-timezone-specs.html

基本上,posix格式是一种指定时区规则的方法。

有点像

[abbreviation][offset][daylight savings abbrev][DST offset][dst rules]

所以说'UCT+2‘可能是“不好的形式”,因为你试图改变缩写'UTC’的含义,它有一个标准的用法。

您可以验证它没有使用时区的" UCT“部分来引用实际的UCT时区。如果你这样做:

代码语言:javascript
复制
SELECT ('2021-11-02 08:00:00+00' AT TIME ZONE 'BOB')

PostgreSQL会说它不承认时区“鲍勃”。

但如果你这么做

代码语言:javascript
复制
SELECT ('2021-11-02 08:00:00+00' AT TIME ZONE 'BOB+2')

它会很高兴地给你06:00:00。事实上,如果你愿意的话,你可以把(几乎)任何东西都粘在里面,而不是"UCT“。它在计算中没有被使用。

请注意,我链接的posix页面显示

POSIX时区规范不足以处理真实时区历史的复杂性,但有时也有使用它们的理由。

最后,“UCT”是完全有效的,但它正在我的头脑中。我只把它看成是“UTC”,所以直到。

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

https://stackoverflow.com/questions/72036290

复制
相关文章

相似问题

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