在 Postgresql 中,如何使用“在时区”取消反转时区偏移

Dra*_*788 5 postgresql timezone timezone-offset

我正在尝试围绕 Postgresql 时区进行思考,但我似乎无法弄清楚这一点。EST 是美国的“东部标准时间”,通常是UTC-5

示例 1:基础测试

select '08/31/2011 12:00 pm EST'::timestamptz  at time zone 'EST';
      timezone       
---------------------
 2011-08-31 12:00:00
Run Code Online (Sandbox Code Playgroud)

示例 2:偏移量为 +5

select '08/31/2011 12:00 pm EST' at time zone '+5';
      timezone       
---------------------
 2011-08-31 12:00:00
Run Code Online (Sandbox Code Playgroud)

示例 3:偏移量为 -5

 select '08/31/2011 12:00 pm EST' at time zone '-5';
      timezone       
---------------------
 2011-08-31 22:00:00
Run Code Online (Sandbox Code Playgroud)

显然,一切都在倒退。EST 再次......应该是 UTC-5。现在,我确实搜索了文档,它确实解释了事物是“POSIX”,这是向后的。(正偏移位于格林威治标准时间以西,而负偏移位于格林威治标准时间以东)。

但是,我该如何解决这个问题?在应用程序层,我总是可以将 + 号反转为 - 号,但这对我来说似乎有点麻烦 IMO。因此,我的终极问题。

在数据库层(Postgres),有没有办法使用“At Time Zone”语法让 GMT-5 对应于 EST?或者我只需要在应用程序层反转所有内容?

Grz*_*ski 6

使用文档中编写的间隔数据类型来获得正确的行为:

在这些表达式中,所需时区zone可以指定为文本字符串(例如“PST”)或间隔例如INTERVAL“-08:00”)。

基础测试:

SELECT '08/31/2011 12:00 pm EST'::timestamptz AT TIME ZONE 'EST';
      timezone       
---------------------
 2011-08-31 12:00:00
(1 row)
Run Code Online (Sandbox Code Playgroud)

时区信息:

SELECT * FROM pg_timezone_abbrevs WHERE abbrev LIKE 'EST';
 abbrev | utc_offset | is_dst 
--------+------------+--------
 EST    | -05:00:00  | f
(1 row)
Run Code Online (Sandbox Code Playgroud)

适当的偏移量-5:

SELECT '08/31/2011 12:00 pm EST'::timestamptz AT TIME ZONE '-05:00'::interval;
      timezone       
---------------------
 2011-08-31 12:00:00
(1 row)
Run Code Online (Sandbox Code Playgroud)

适当的偏移+5:

SELECT '08/31/2011 12:00 pm EST'::timestamptz AT TIME ZONE '+05:00'::interval;
      timezone       
---------------------
 2011-08-31 22:00:00
(1 row) 
Run Code Online (Sandbox Code Playgroud)