PostgreSQL中的时区转换不一致

PostgreSQL中的时区转换不一致,postgresql,timezone,postgresql-10,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-01T

我试图从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_偏移量”间隔均为10:00:00

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

有人能解释一下这里发生了什么事吗

这实际上在以下部分中有详细描述:

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

  • 完整的时区名称,例如
    美国/纽约。
    […]

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

  • 除了时区名称和缩写外,PostgreSQL还将接受POSIX风格的时区规范,格式为
    STDoffset
    STDoffsetDST
    ,其中
    STD
    是一个时区缩写,
    offset
    是一个以小时为单位的数值偏移量,从UTC往西,而
    DST
    是一个可选的夏令时区缩写,假定在给定偏移量之前一小时。[……]

[……]

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


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

,我想你是这样的;We’我们正在看这个的副本:为什么不在时区“澳大利亚/布里斯班”通过
?谢谢Laurenz,在更仔细地阅读了文档之后,这现在是有意义的。我曾认为,由于pg_timezone_names视图中许多行的“+10”位于“abbrev”字段中,因此它将从此处开始。我没有提到pg_时区_abbrevs视图和POSIX偏移量位于GMT以西。