PostgreSQL:特定时区早于对应年份的时间转timestamptz时区错误
PostgreSQL旧时区历史数据转换错误的原因分析
你遇到的这类早期年份时区偏移计算错误,核心原因是PostgreSQL依赖的tzdata(IANA时区数据库)版本过旧。
PostgreSQL本身不维护时区规则,完全依赖tzdata提供的时区历史变更数据。在你使用的14至15.3版本中,默认捆绑的tzdata版本相对老旧:
- 像Antarctica/Syowa时区的UTC+3偏移规则,是在后续的tzdata更新中才补充完善了1947年及更早的历史偏移定义;
- Asia/Aqtau(1931年前)、Indian/Comoro(1943年前)等时区的早期历史偏移错误,也是因为旧版tzdata中没有正确记录这些时区的历史规则,后续tzdata版本才修正了这些问题。
简单验证当前tzdata版本的方式:
- 在PostgreSQL中执行:
SELECT pg_tz_version();可直接查看当前使用的tzdata版本号 - Linux系统层面可以用
zdump -v Antarctica/Syowa | grep 1947查看该时区1947年的偏移规则
解决这类问题的直接方案:
- 升级PostgreSQL到更新的版本(比如15.4及以上、16.x系列),这些版本捆绑了更新的tzdata,包含修正后的时区历史规则;
- 若无法升级PostgreSQL,可手动更新系统的tzdata数据库,然后重新初始化PostgreSQL的时区数据(具体操作需参考对应系统和PostgreSQL版本的文档)。
内容的提问来源于stack exchange,提问作者drewango
相关产品推荐
相关产品推荐

