你能从Postgresql TIMESTAMP WITH TIME ZONE字段中恢复完整的时区名称吗?

时间:2014-01-26 18:05:08

标签: postgresql timezone timestamp dst

采用以下示例:

create temporary table t1 (c1 timestamp with time zone);
insert into t1 values ('2003-04-12 04:05:06 America/New_York'::timestamp with time zone);

如果我正确阅读文档,这里Postgresql将使用完整的时区名称通过添加+05:00小时将时间戳转换为UTC,然后存储。

但如果这是真的那么我就无法区分2003-04-12 04:05:06 America/New_York2003-04-12 04:05:06 America/Panama,它们具有相同的UTC偏移但是夏令时偏移量不同。

是吗?

2 个答案:

答案 0 :(得分:2)

PostgreSQL不存储原始时区。您可以在需要时将其作为单独的列进行。

http://postgres.cz/wiki/PostgreSQL_SQL_Tricks_III#Domain_for_time_zone

CITEXT是PostgreSQL contrib包中不区分大小写的文本类型。如果您不想安装文本,可以使用文本。

答案 1 :(得分:0)

虽然确实一旦存储,就无法进入原始命名的时区。我相信当存储带有时区的时间戳时,它会在转换为postgres时转换为时间戳并偏移+ - HHMM,包括时区的夏令时。我做了一个实验:

create temporary table t1 (c1 timestamp with time zone);
insert into t1 values ('2003-04-12 04:05:06 America/New_York'::timestamp with time zone);
insert into t1 values ('2003-04-12 04:05:06 America/Panama'::timestamp with time zone);


nsp=# select c1 at time zone 'utc' from t1;
      timezone       
---------------------
 2003-04-12 08:05:06
 2003-04-12 09:05:06
(2 rows)

这些对我来说似乎是正确的。 2003年,巴拿马是UTC-5,没有夏令时。 2003年,America / New_York从4月6日(UTC-4)开始减去一小时。所以,时间是正确的,你可以分辨出两者之间的区别。

-g