我正在尝试从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')
有人可以解释一下这里发生的事情吗?
答案 0 :(得分:1)
这实际上在the documentation中有详细描述:
PostgreSQL允许您以三种不同的形式指定时区:
完整的时区名称,例如
America/New_York.
[...]时区缩写,例如
PST
。 [...]除了时区名称和缩写外,PostgreSQL还接受
STDoffset
或STDoffsetDST
形式的POSIX样式的时区规范,其中STD
是时区缩写,offset
是距离UTC西数小时的数字偏移量,而DST
是可选的夏令时缩写,假定比给定偏移量早一小时。 [...][...]
要记住的另一个问题是,在POSIX时区名称中,格林威治的 西 位置使用正偏移量。 PostgreSQL在其他任何地方都遵循ISO-8601约定,正时区偏移量是格林威治的 东 。
因此,AEST
的POSIX等效为-10
或UTC-10
。