PostgreSQL中的时区转换不一致

时间:2018-09-03 10:09:27

标签: postgresql timezone postgresql-10

我正在尝试从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')

有人可以解释一下这里发生的事情吗?

1 个答案:

答案 0 :(得分:1)

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

  

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

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

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

  •   
  • 除了时区名称和缩写外,PostgreSQL还接受STDoffsetSTDoffsetDST形式的POSIX样式的时区规范,其中STD是时区缩写, offset是距离UTC西数小时的数字偏移量,而DST是可选的夏令时缩写,假定比给定偏移量早一小时。 [...]

  •   
     

[...]

     

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

因此,AEST的POSIX等效为-10UTC-10