PostgreSQL中夏令时的时区

时间:2012-04-30 11:41:59

标签: postgresql timezone timestamp

我们正在部署我们自己的流量计(很像USGS规格:http://waterdata.usgs.gov/usa/nwis/uv?site_no=03539600)所以我们皮划艇运动员知道是否有足够的水来划水流并且不会浪费时间和气体来驱逐那里。我们希望在横跨东部和中部时区的东南白水区安装其中一些。

我正在使用记录的默认值current_time存储插入记录的时间。我想稍后使用MM/DD/YYYY HH12:MI AM TZ格式显示数据,输出类似03/12/2012 01:00 AM CDT的读数。我也希望输出能够意识到日光节省时间的变化,所以当我们“向前”和“退回”时,前一句的最后部分会在CST和CDT之间发生变化。这一变化发生在今年3月11日,我在下面的DST线两侧都包含了日期。我正在使用我的Windows 7笔记本电脑进行开发,之后我们将在Unix机器上进行部署。 Postgres显然发现我的Windows电脑设置在美国东部时区。我正在尝试使用“没有时区的时间戳”字段和“带时区的时间戳”字段但无法使其工作。

我尝试在我的选择中使用'at time zone',并且每件事情都有效,直到显示时区为止。当我在CDT要求时间时,实际小时是时间戳的一部分被正确地减去一个小时。但EDT显示在输出中。

SELECT reading_time as raw,
       reading_time at time zone 'CDT',
       to_char(reading_time at time zone 'CDT',
           'MM/DD/YYYY HH12:MI AM TZ') as formatted_time
  FROM readings2;

"2012-04-29 17:59:35.65";"2012-04-29 18:59:35.65-04";"04/29/2012 06:59 PM EDT"
"2012-04-29 17:59:40.19";"2012-04-29 18:59:40.19-04";"04/29/2012 06:59 PM EDT"
"2012-03-10 00:00:00";"2012-03-10 00:00:00-05";"03/10/2012 12:00 AM EST"
"2012-03-11 00:00:00";"2012-03-11 00:00:00-05";"03/11/2012 12:00 AM EST"
"2012-03-12 00:00:00";"2012-03-12 01:00:00-04";"03/12/2012 01:00 AM EDT"

我将每个仪表所在的时区存储在字符变化字段中的单独表格中。我考虑将此值附加到时间输出的末尾,但我希望它在没有我干预的情况下从CST更改为CDT。

感谢您的帮助。

3 个答案:

答案 0 :(得分:28)

您可以考虑使用full Olsen-style time zone names,而不是使用CDT或CST等时区名称。在中央时间的情况下,您可以选择时区。与您的位置匹配的任何一个,例如America/Chicago,或仅US/Central。这可以确保PostgreSQL使用Olsen tz数据库自动确定夏令时是否适用于任何给定日期。

答案 1 :(得分:6)

你肯定想要一个TIMESTAMP WITH TIME ZONE列(在PostgreSQL中也称为timestamptz)。这将以UTC格式存储时间戳,以便它代表特定的时刻。与名称相反,它在列中保存时区 - 您可以使用AT TIME ZONE短语在您选择的时区中查看检索到的时间戳。

TIMESTAMP WITHOUT TIME ZONE的语义令人困惑,几乎无用。我强烈建议你根本不要使用那种类型。

关于在CHARACTER VARYING列中存储时间戳的问题,我真的很困惑。这似乎可能是问题的一部分。如果您可以从一开始就将其存储在timestamptz中,我怀疑您的问题会更少。除此之外,使用-04表示法来抵消UTC是最安全的;但这对我来说似乎没有任何好处。

答案 2 :(得分:1)

您可以使用Guan Yang's answer中建议的格式创建已知时区的表,然后对该表使用外键列。有效的时区可以从pg_timezone_names获得。我已在this related answer中详细了解。

相关问题