Ber*_*ner 6 postgresql timestamp-with-timezone
PostgreSQL 文档相当详尽且有用:
https://www.postgresql.org/docs/9.2/datatype-datetime.html#DATATYPE-TIMEZONES
但似乎忽略了一个相当有用的点的清晰度,在这个点上清晰度可能是必要的和有帮助的。阅读了文档和各种相关的 stackoverflow 问题和回复后,我怀疑以下情况是正确的:
PostgreSQL 数据类型
timestamp with timezone
存储日期和时间以及 utcoffset(+ve 在格林威治以东)
我会进一步推断并怀疑这是真的:
PostgreSQL 数据类型
timestamp with timezone
将日期和时间以及 utcoffset(+ve 在格林威治以东)存储到分钟分辨率。
我的问题与这些推论有关。它们是否正确,如果正确,可以转发哪些证据来证实它们,如果不正确,可以转发哪些相反的证据。
这很有趣的主要原因当然是因为如果为真,那么接受表中pg_timezone_names
存储的名称或缩写的时区的 PostgreSQL只存储 UTC 偏移量,从而丢失 DST 信息。
意思是,为了使实际时区名称(如表中定义的pg_timezone_names
)将来可供读者使用,它必须与旁边的timestamp with timezone
列显式存储在一起。
我现在感兴趣的主要原因是我想到了一种相当聪明的渲染时间方式,可以记录地球上任何地方的事件时间。即如果记录的时间在用户当前时区,则将其报告为一个简单的日期/时间(没有时区信息),并且只有当它在与读者不同的时区中时,才报告时区信息(即使如此,时区名称可能比 UTC 偏移量更用户友好)。
如果我希望在网站上实现这种上下文敏感的渲染,看起来我将不得不在我的事件时间(以及我存储的任何其他时区感知日期/时间)旁边存储时区名称。
但是我对基于推理而非知识做出这样的承诺感到不自在,并且想要一些支持或反驳这些推理的证据。
您的两个假设都是错误的:
timestamp with time zone
PostgreSQL 将8 字节整数存储为包含以2000-01-01 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.)
Run Code Online (Sandbox Code Playgroud)
在同一个文件中,您会发现
/* 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) */
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
768 次 |
最近记录: |