PostgreSQL文档是相当彻底的和有用:
https://www.postgresql.org/docs/9.2/datatype-datetime.html#DATATYPE-TIMEZONES
但似乎忽略了一个相当有用的地步清晰度可能保证和帮助清晰度。已经阅读文档和各种相关计算器问题和回答,只剩下我怀疑下面是正确的:
PostgreSQL的数据类型
timestamp with timezone
存储日期和时间以及UTCOFFSET(+已经是东格林尼)
我将进一步推断,并怀疑这是事实:
PostgreSQL的数据类型
timestamp with timezone
存储日期和时间以及UTCOFFSET(+已经是格林威治以东)到分钟的分辨率。
我的问题涉及到这些推论。他们是否正确,如果有什么样的证据才能被转发,以确认他们,如果没有什么证据可以转发到相反。
最主要的原因,这是有趣的是,因为当然如果为真,那么PostgreSQL的存储在表pg_timezone_names
其接受由名称或缩写时区只存储UTC偏移,从而失去了DST的信息。
含义,使实际的时区名称(如表中pg_timezone_names
定义)提供给未来的读者,必须明确地存储在旁边旁边一列timestamp with timezone
。
这让我感兴趣的,现在主要的原因是,我脑子里想的是什么,我觉得是渲染时间,可以在地球上任何地方记录事件的时间相当聪明的办法。也就是说,如果记录的时间是在用户的当前时区,然后报告这是一个天真的日期/时间(无时区信息),且仅当它是在给读者不同的时区,报告时区信息(即使如此,该区名称可能是多个用户与UTC偏移)友好。
它看起来像我将不得不存储区名称我的事件时间(以及任何其他时区知道的日期/时间的我店)的旁边,如果我想实现一个网站上这样的敏感内容的呈现。
但我安心做推理的基础上,这样的承诺,而不是知识生病,想一些证据支持或反驳这些推断。
无论你的假设是错误的:
PostgreSQL的存储timestamp with time zone
作为8字节整数,其中包含从以微秒2000-01-01 00:00:00 UTC
的偏移量。
因此,它既不存储时区,也不是精度1分钟。
在转换为字符串,时间戳根据timezone
参数的当前设置格式化。
所以,如果你必须单独存放时区,如果你需要记住它,并使用AT TIME ZONE
表达了时间戳转换为正确的时区。
你问到我的文档引用。其中一部分是here:
/*
* 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) */