我最近在postgres中遇到了timestamptz的麻烦。我现在明白,时间总是在数据库中保存为utc,插入和取出的内容取决于连接中设置的内容。 This博客文章帮助澄清了最初的混淆。
但是在搜索连接所具有的时区时安全的语法时,我仍然遇到了一些奇怪的事情:
postgres=# show timezone;
TimeZone
----------
UTC
(1 row)
postgres=# select '2000-01-01 00:00:00+07' at time zone 'GMT+07', '2000-01-01 00:00:00+07' at time zone 'Asia/Jakarta';
timezone | timezone
---------------------+---------------------
1999-12-31 10:00:00 | 2000-01-01 00:00:00
(1 row)
postgres=# select current_timestamp, current_timestamp at time zone 'GMT+07', current_timestamp at time zone 'Asia/Jakarta';
now | timezone | timezone
-------------------------------+----------------------------+----------------------------
2018-01-29 06:17:07.845564+00 | 2018-01-28 23:17:07.845564 | 2018-01-29 13:17:07.845564
(1 row)
因此,'Asia/Jakarta'
的版本按预期工作,但'+7'
,'+07'
,'GMT+07'
和'UTC+07'
为我提供了预期的时间戳减去14小时。
为什么会发生这种情况以及将timestamptz转换为独立于连接时区的不同时区的正确方法是什么?