在带有 C 扩展名的 Postgres DB 中使用时区存储时间戳?

Posted

技术标签:

【中文标题】在带有 C 扩展名的 Postgres DB 中使用时区存储时间戳?【英文标题】:Storing timestamp with timezone in Postgres DB with a C extension? 【发布时间】:2017-11-20 03:49:51 【问题描述】:

简而言之,在输入我的 Postgres DB 时,我有一个格式为“2014-12-10T12:00:14+07:00”的时间戳,我想使用“timestampandtz”Postgres C 扩展(@ 987654321@),但我不知道如何处理确定时区的问题。

由于扩展程序将输入与 zone.c 中的完整时区名称进行比较,因此数据类型将不知道如何处理“+07:00”而不是“@ Continent/City”,它期望输入.

问题是,我需要以某种方式从“+07:00”中撤出城市,因为我确实需要夏令时分辨率。 另外,我知道这些时间戳仅来自一个国家,因此也许可以根据此考虑确定“@ Continent/City”。

任何关于如何应对这一挑战的 POV 将不胜感激,谢谢!

【问题讨论】:

即使没有扩展,PostgreSQL 也能够毫无问题地处理转换。我尝试了像 select ('2014-12-10T12:00:14+07:00'::timestamp with time zone) at time zone 'Europe/Berlin' 这样的 PG 9.6 命令,它可以工作。 PostgreSQL 在时区表中有用于应用夏令时规则的标志。所以我会先尝试标准方式。 @JosMac 当然,这是正确的做法。但由于我不知道城市,因此 +xx -> 大陆/城市关系,我需要自己进行翻译,因为 DST 是一个要求...... 【参考方案1】:

恐怕你运气不好。无法自动将 +07:00 之类的时间偏移量转换为 US/Eastern 之类的时区。

原因是相同的时间偏移可以属于不同的时区。例如,-05:00 当前可能是America/LimaUS/Central,但它们是不同的时区——前者没有夏令时。

所以你必须自己想出一个翻译,例如如果您知道具有特定时间偏移的所有数据属于哪个时区。

【讨论】:

感谢您解决这个问题,我会尝试考虑一下 =)

以上是关于在带有 C 扩展名的 Postgres DB 中使用时区存储时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

Django - 无法使用两个数据库进行测试(带有 gis 扩展的 postgres 和 mongoDB (Djongo)

带有事务块的 Python Postgres 查询

sequelize db:migrate 和 postgres 的问题

ping Postgres DB以检查正常运行时间的URL

C#-“DateTime.UtcNow”以一种格式输出日期,该格式被视为超出 Postgres DB 的范围

在 UIViewController 中使单元格可点击