【问题标题】:Inconsistent time zone conversion in PostgreSQL [duplicate]PostgreSQL中的时区转换不一致[重复]
【发布时间】:2018-09-03 10:09:26
【问题描述】:

我正在尝试从 PostgreSQL 数据库中的 timestamptz 字段中选择本地时间(如澳大利亚/布里斯班),并注意到当我使用 +10 时区缩写时,PostgreSQL 似乎从UTC 值而不是添加 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')

谁能解释这里发生了什么?

【问题讨论】:

标签: postgresql timezone postgresql-10


【解决方案1】:

这实际上在the documentation中有详细描述:

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

  • 完整的时区名称,例如America/New_York. [...]

  • 时区缩写,例如PST。 [...]

  • 除了时区名称和缩写之外,PostgreSQL 将接受 <em>STDoffset</em><em>STDoffsetDST</em> 形式的 POSIX 样式时区规范,其中 <em>STD</em> 是时区缩写,<em>offset</em> 是数字UTC 以西的小时偏移量,<em>DST</em> 是可选的夏令时区缩写,假定比给定偏移量早一小时。 [...]

[...]

要记住的另一个问题是,在 POSIX 时区名称中,正偏移用于格林威治 west 的位置。在其他任何地方,PostgreSQL 都遵循 ISO-8601 约定,即正时区偏移量是格林威治的

因此,AEST 的 POSIX 等效项将是 -10UTC-10

【讨论】:

  • 感谢 Laurenz,在仔细阅读了文档之后,这很有意义。我曾认为,由于“+10”位于 pg_timezone_names 视图中许多行的“缩写”字段中,因此将从那里获取。我错过了提到 pg_timezone_abbrevs 视图和 GMT 以西的 POSIX 偏移量。
猜你喜欢
  • 1970-01-01
  • 2017-02-27
  • 2020-08-16
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 2021-04-16
相关资源
最近更新 更多