PostgreSQL中的时区转换不一致[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL中的时区转换不一致[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我试图从PostgreSQL数据库中的timestamptz字段中选择当地时间(如在澳大利亚/布里斯班)并注意到当我使用+10时区缩写时,PostgreSQL似乎从UTC值减去10小时而不是添加10小时。

如果我使用AEST作为缩写,则正确添加10小时。

当我运行以下查询时,我希望返回的两个值都是相同的。

select 
  ('2018-01-01T00:00:00Z'::timestamp with time zone) at time zone 'AEST', 
  ('2018-01-01T00:00:00Z'::timestamp with time zone) at time zone '+10';

但是,在我的情况下,我看到以下结果:

"2018-01-01 10:00:00"   | "2017-12-31 14:00:00"

如果我运行以下查询,则所有行的“utc_offset”间隔为10:00:00。

select * from pg_timezone_names
where abbrev in ('+10', 'AEST')

谁能提供关于这里发生了什么的解释?

答案

这实际上在the documentation中有一些细节描述:

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

  • 全时区名称,例如America/New_York. [...]
  • 时区缩写,例如PST。 [...]
  • 除了时区名称和缩写外,PostgreSQL还将接受形式为STDoffsetSTDoffsetDST的POSIX风格时区规格,其中STD是区域缩写,offset是UTC以西的小时数字偏移,DST是可选日光 - 储蓄区缩写,假定在给定偏移之前一小时。 [...]

[...]

另外要记住的一个问题是,在POSIX时区名称中,正偏移用于格林威治以西的位置。在其他地方,PostgreSQL遵循ISO-8601惯例,正面时区偏移位于格林威治以东。

因此,AEST的POSIX等价物将是-10UTC-10

以上是关于PostgreSQL中的时区转换不一致[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在特殊时区将当前日期和时间转换为PHP中的十进制(16,4)[重复]

PostgreSQL 错误地从没有时区的时间戳转换为有时区的时间戳

Postgresql 在没有时区的情况下将秒转换为时间

PostgresQL + Spring JPA:org.postgresql.util.PSQLException:错误:无法将类型 bytea 转换为没有时区的时间戳

PostgreSQL:无法使用 DST 使时区正常工作

从当前时区转换为 UTC 是不正确的 swift [重复]