15

我们正在部署我们自己的流量测量仪(很像这个 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 之间发生变化。这一变化发生在今年 2012 年 3 月 11 日,我在下面这条 DST 行的两边都包含了日期。我正在使用我的 Windows 7 笔记本电脑进行开发,稍后我们将在 Unix 机器上进行部署。Postgres 显然检测到我的 Windows 计算机设置为美国东部时区。我正在尝试使用“不带时区的时间戳”字段和“带时区的时间戳”

我已经尝试在我的选择中使用“在时区”,并且一切正常,直到显示时区。当我在 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。

谢谢你的帮助。

4

3 回答 3

49

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

于 2012-04-30T15:09:49.003 回答
8

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

TIMESTAMP WITHOUT TIME ZONE 的语义令人困惑,几乎毫无用处。我强烈建议您根本不要使用该类型来描述您所描述的内容。

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

于 2012-04-30T12:43:55.683 回答
1

You can create a table of known timezones in the format suggested in Guan Yang's answer, and then use a foreign key column to this table. Valid timezones can be obtained from pg_timezone_names I've gone into more detail in this related answer.

于 2015-03-07T01:15:56.030 回答