在Postgresql中,如何使用“At Time Zone”取消时区偏移

时间:2011-08-19 05:36:26

标签: 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

示例2:偏移量为+5

select '08/31/2011 12:00 pm EST' at time zone '+5';
      timezone       
---------------------
 2011-08-31 12:00:00

示例3:偏移为-5

 select '08/31/2011 12:00 pm EST' at time zone '-5';
      timezone       
---------------------
 2011-08-31 22:00:00
显然,一切都是倒退的。 EST再次...... supposed to be UTC-5。现在,我确实搜索了文档,它确实解释了事物是“POSIX”,which is backwards。 (正偏移位于格林威治标准时间以西,而负偏移位于格林威治标准时间以东)。

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

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

1 个答案:

答案 0 :(得分:2)

使用documentation中所写的interval数据类型来获得正确的行为:

  

在这些表达式中,可以指定所需的时区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)

时区信息:

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

正确偏移-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)

正确偏移+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)