在带有 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/Lima
或US/Central
,但它们是不同的时区——前者没有夏令时。
所以你必须自己想出一个翻译,例如如果您知道具有特定时间偏移的所有数据属于哪个时区。
【讨论】:
感谢您解决这个问题,我会尝试考虑一下 =)以上是关于在带有 C 扩展名的 Postgres DB 中使用时区存储时间戳?的主要内容,如果未能解决你的问题,请参考以下文章
Django - 无法使用两个数据库进行测试(带有 gis 扩展的 postgres 和 mongoDB (Djongo)
sequelize db:migrate 和 postgres 的问题