我正在尝试了解 Postgresql 时区,但我似乎无法弄清楚这一点。 EST 是美国的“东部标准时间”,通常是UTC-5 http://en.wikipedia.org/wiki/Eastern_Time_Zone.
示例 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又来了...应该是 UTC-5 http://en.wikipedia.org/wiki/Eastern_Time_Zone。现在,我确实搜索了文档,它确实解释了事情是“POSIX”,这是向后的 http://www.postgresql.org/docs/8.4/static/datatype-datetime.html#DATATYPE-TIMEZONES。 (正偏移量为 GMT 以西,负偏移量为 GMT 以东)。
然而,我该如何解决这个问题呢?在应用程序层,我总是可以将+号反转为-号,但这对我来说似乎有点混乱。因此,这是我的终极问题。
在数据库层(Postgres),有没有办法使用“At Time Zone”语法使GMT-5对应于EST?或者我只需要反转应用程序层的所有内容?
使用编写的间隔数据类型文档 http://www.postgresql.org/docs/current/interactive/functions-datetime.html#FUNCTIONS-DATETIME-ZONECONVERT获得正确的行为:
在这些表达式中,所需的时区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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)