如果我运行这个查询:
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时区。
但是,运行以下查询:
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值相反。有人能解释一下为什么会发生这种事吗?
发布于 2022-04-28 00:54:35
哇,这里有很多东西要打开。
最主要的是(错误地引用Inigo ),我不认为UTC+2的意思是你认为它的意思。
这里一件重要的事情是精确的格式。
你说你得到了这个结果:
2021-11-02 06:00:00+00但我得到的是:
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将接受以下三种方式指定的时区:
实际上,它不包括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时区。如果你这样做:
SELECT ('2021-11-02 08:00:00+00' AT TIME ZONE 'BOB')PostgreSQL会说它不承认时区“鲍勃”。
但如果你这么做
SELECT ('2021-11-02 08:00:00+00' AT TIME ZONE 'BOB+2')它会很高兴地给你06:00:00。事实上,如果你愿意的话,你可以把(几乎)任何东西都粘在里面,而不是"UCT“。它在计算中没有被使用。
请注意,我链接的posix页面显示
POSIX时区规范不足以处理真实时区历史的复杂性,但有时也有使用它们的理由。
最后,“UCT”是完全有效的,但它正在我的头脑中。我只把它看成是“UTC”,所以直到。
https://stackoverflow.com/questions/72036290
复制相似问题