PostgreSQL存储哪些时区信息?

7
PostgreSQL文档非常详尽和有用:

https://www.postgresql.org/docs/9.2/datatype-datetime.html#DATATYPE-TIMEZONES

但似乎在一个相当有用的点上忽视了清晰度,需要更多的明确性和帮助。阅读文档和各种相关的stackoverflow问题和回答后,我怀疑以下内容是正确的:
PostgreSQL数据类型timestamp with timezone存储日期、时间和UTC偏移量(+ve为东格林威治)。
我进一步推断并怀疑这是真的:
PostgreSQL数据类型timestamp with timezone存储日期、时间和UTC偏移量(+ve为东格林威治),到分钟分辨率。
我的问题与这些推断有关。它们是否正确,如果是,可以提供什么证据来确认它们,如果不是,可以提供什么证据来反驳它们。
这很有趣的主要原因是,如果这是真的,那么PostgreSQL只接受由表pg_timezone_names中存储的时区名称或缩写,并且仅存储UTC偏移量,从而丢失DST信息。
这意味着,为了在将来向读者提供实际的时区名称(如表pg_timezone_names中定义的),必须将其显式地存储在其旁边的列中,以使其与timestamp with timezone一起使用。
目前我感兴趣的主要原因是,我有一个相当聪明的方式来呈现能够记录地球上任何事件时间的时间。即如果记录的时间在用户当前时区,则将其报告为简单的日期/时间(没有时区信息),仅当它在与读者不同的时区时,报告时区信息(甚至时区名称可能比UTC偏移更友好)。
看起来,如果我想在网站上实现这种上下文敏感的呈现,我将被迫在我的事件时间旁边存储时区名称(以及我存储的任何其他时区感知日期/时间)。但是,基于推断而不是知识做出这样的承诺让我感到不安,我希望有一些支持或反驳这些推论的证据。

1
您可以始终使用“...在时区...”检索这些时间戳,并提供用户的时区。 - user330315
1个回答

5
你的两个假设都是错误的:
PostgreSQL将带有时区的时间戳存储为一个8字节的整数,其中包含相对于2000年1月1日00:00:00 UTC的微秒偏移量。
因此,它既不存储时区,也不是精度为1分钟。
在转换为字符串时,时间戳会根据timezone参数的当前设置进行格式化。
因此,如果你需要记住时区并使用AT TIME ZONE表达式将时间戳转换为正确的时区,则需要单独存储时区。
你要求文档参考。其中一部分在这里
/*
 * Timestamp represents absolute time.
[...]
 * Timestamps, as well as the h/m/s fields of intervals, are stored as
 * int64 values with units of microseconds.  (Once upon a time they were
 * double values with units of seconds.)

在同一文件中,您会发现:
/* Julian-date equivalents of Day 0 in Unix and Postgres reckoning */
#define UNIX_EPOCH_JDATE        2440588 /* == date2j(1970, 1, 1) */
#define POSTGRES_EPOCH_JDATE    2451545 /* == date2j(2000, 1, 1) */

非常感谢您的回复,Laurenz。但是这让我有两个问题:1)这在哪里有记录(即证据在哪里,您是如何知道这一点的,或者我如何在发布问题之前就知道这一点)。2)您建议的方式令人怀疑。为什么?因为数据类型被命名为“带时区的时间戳”,显然不是,如果我相信您的描述,它更好地命名和考虑为“UTC时间戳”。我真正想了解的是这个领域的一些真实文档。但是我担心您是正确的,因为要做我需要的事情,我需要单独存储时区。 - Bernd Wechner
好的,我在这里找到了进一步的线索,它明确记录了带时区和不带时区时间戳之间的8字节存储标识:[https://www.javatpoint.com/postgresql-datatypes]。那是部分/大部分的解决方案。而在这里,我发现了一篇很棒的文章[https://tapoueh.org/blog/2018/04/postgresql-data-types-date-timestamp-and-time-zones/],可能已经足够了解文档。 - Bernd Wechner
1
我已经添加了文档链接。 - Laurenz Albe

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