PostgreSQL中带有夏令时的时区

18
我们正在部署自己的流量计(与此USGS 测量仪非常相似),这样我们皮划艇爱好者就可以知道河流的水量是否足够,在不必要地浪费时间和汽油去那里之前就能知道。我们希望在东部和中部时区跨越的东南急流区域安装几个这样的流量计。
我使用记录的默认值 current_time 存储插入记录的时间。我希望以 MM/DD/YYYY HH12:MI AM TZ 格式显示数据,输出结果类似于03/12/2012 01:00 AM CDT。我还希望输出结果能够意识到夏令时的更改,因此当我们“向前弹”和“倒回来”时,前面句子的最后一部分将在 CST 和 CDT 之间更改。今年的更改发生在3/11/2012,下面包括此 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,而不需要我的干预。

感谢您的帮助。


1
如果你能在这里发布psql\d readings2的输出,那将非常有帮助。 - vyegorov
3个回答

57

不要使用像CDTCST这样的时区缩写,你可以考虑使用完整的Olson风格时区名称。 对于中央时间,您可以选择时区,例如与您所在位置匹配的America/Chicago,或仅US/Central。 这确保PostgreSQL使用Olson tz数据库自动确定任何给定日期是否应用夏令时。


8
您一定希望有一个名为timestamptzTIMESTAMP WITH TIME ZONE列(在PostgreSQL中也称为timestamptz)。这将在UTC时间下存储时间戳,因此它代表了特定的时间点。与名称所示相反,它不会在列中保存时区 -- 您可以使用AT TIME ZONE短语在您选择的时区中查看检索到的时间戳。 的语义令人困惑且几乎没有用处。我强烈建议您完全不要对您所描述的内容使用该类型。
我对问题中谈论将时间戳存储在CHARACTER VARYING列中的部分感到非常困惑。如果您可以从一开始就在timestamptz中存储它,我认为您将会有较少的问题。除此之外,最安全的方法是使用UTC偏移量的-04表示法;但对我而言,这似乎是多余的工作而没有任何好处。

2
为了补充你的回答,这里有一个更深入处理此问题的链接:http://phili.pe/posts/timestamps-and-time-zones-in-postgresql/ - jgburet

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接