这个问题在这里已有答案:
我试图从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还将接受形式为
STDoffset
或STDoffsetDST
的POSIX风格时区规格,其中STD
是区域缩写,offset
是UTC以西的小时数字偏移,DST
是可选日光 - 储蓄区缩写,假定在给定偏移之前一小时。 [...][...]
另外要记住的一个问题是,在POSIX时区名称中,正偏移用于格林威治以西的位置。在其他地方,PostgreSQL遵循ISO-8601惯例,正面时区偏移位于格林威治以东。
因此,AEST
的POSIX等价物将是-10
或UTC-10
。