PostgreSQL中具有夏令时的时区

PostgreSQL中具有夏令时的时区,postgresql,timezone,timestamp,Postgresql,Timezone,Timestamp,我们正在部署我们自己的测流仪,非常像美国地质勘探局的测流仪:这样我们的皮划艇运动员就知道是否有足够的水来划水,而不必浪费时间和汽油开车去那里。我们希望在横跨东部和中部时区的东南白水区安装一些这样的装置 我使用记录的默认值current_time来存储插入记录的时间。我想稍后使用MM/DD/YYYY HH12:MI AM TZ格式显示数据,该格式输出的读数类似于2012年12月3日凌晨01:00 CDT。我还想让输出知道日光节约时间的变化,因此前一句的最后一部分将在CST和CDT之间变化,当我们“

我们正在部署我们自己的测流仪,非常像美国地质勘探局的测流仪:这样我们的皮划艇运动员就知道是否有足够的水来划水,而不必浪费时间和汽油开车去那里。我们希望在横跨东部和中部时区的东南白水区安装一些这样的装置

我使用记录的默认值current_time来存储插入记录的时间。我想稍后使用MM/DD/YYYY HH12:MI AM TZ格式显示数据,该格式输出的读数类似于2012年12月3日凌晨01:00 CDT。我还想让输出知道日光节约时间的变化,因此前一句的最后一部分将在CST和CDT之间变化,当我们“向前跳”和“向后退”时。这一变化发生在今年的3/11/2012,我在下面的DST行的两侧都包含了日期。我正在使用我的Windows7笔记本电脑进行开发,稍后我们将在Unix设备上进行部署。Postgres显然检测到我的Windows计算机被设置为美国东部时区。我正在尝试使用“没有时区的时间戳”字段和“有时区的时间戳”字段,但无法使其工作

我试着在我的选择中使用“在时区”,所有的东西都在工作,直到它的时间显示时区。当我在CDT中询问时间时,实际小时是时间戳的一部分,正确地减去一小时。但EDT显示在输出中

选择读取时间作为原始时间, 读取时区“CDT”的时间, 要读取时区“CDT”的时间, “MM/DD/YYYY HH12:MI AM TZ”作为格式化时间 从阅读2; 2012-04-29 17:59:35.65;2012-04-29 18:59:35.65-04;2012年4月29日美国东部时间下午6:59 2012-04-29 17:59:40.19;2012-04-29 18:59:40.19-04;2012年4月29日美国东部时间下午6:59 2012-03-10 00:00:00;2012-03-10 00:00:00-05;2012年10月3日美国东部时间上午12:00 2012-03-11 00:00:00;2012-03-11 00:00:00-05;2012年11月3日美国东部时间上午12:00 2012-03-12 00:00:00;2012-03-12 01:00:00-04;2012年12月3日美国东部时间凌晨01:00 我将每个仪表位于一个字符变化字段的时区存储在一个单独的表中。我考虑只将这个值附加到时间输出的末尾,但我希望它在没有我干预的情况下从CST更改为CDT

谢谢您的帮助。

您肯定想要一个带有时区列的时间戳,在PostgreSQL中也称为timestamptz。这将以UTC格式存储时间戳,以便它表示特定的时间点。与名称相反,它不会在列中保存时区-您可以使用AT time zone短语在您选择的时区中查看检索到的时间戳

没有时区的时间戳的语义是混乱的,几乎是无用的。我强烈建议你不要在你描述的内容中使用那种类型


我真的被问题中关于将时间戳存储在字符变化列中的部分弄糊涂了。这似乎是问题的一部分。如果你能从一开始就把它存储在timestamptz中,我想你的问题会少一些。除此之外,最安全的做法是使用-04符号表示UTC的偏移量;但这对我来说似乎没有什么好处。

不要使用像CDT或CST这样的时区名称,你可以考虑使用。在中央时间的情况下,您可以选择时区。可以选择与您所在位置相匹配的,如美国/芝加哥,也可以仅选择美国/中部。这确保PostgreSQL使用Olsen tz数据库自动计算夏令时是否适用于任何给定日期。

您可以按照中建议的格式创建一个已知时区的表,然后在此表中使用外键列。有效时区可以从中获得,我已经在中进行了详细介绍。

如果您可以在此处发布psql的\d读数2的输出,这将非常有用。要添加您的答案,请在此处添加一个链接,以处理此问题: