什么时区信息PostgreSQL的呢店?

问题描述 投票:4回答:1

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-timezone
1个回答
2
投票

无论你的假设是错误的:

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) */
© www.soinside.com 2019 - 2024. All rights reserved.