如何固定PostgreSQL中Asia/Tehran时区的utc_offset为+0330?
解决PostgreSQL中Asia/Tehran时区偏移错误的问题
问题根源
PostgreSQL的时区规则依赖IANA时区数据库(tzdata),pg_timezone_names是系统生成的视图,数据直接读取自tzdata文件,无法直接修改。你遇到的错误是因为系统视图不支持直接UPDATE操作,且伊朗2023年取消夏令时的规则可能未同步到你当前的tzdata版本。
正确解决方案
1. 更新系统时区数据库(推荐)
确保服务器的tzdata包是最新版本,这样PostgreSQL会自动获取Asia/Tehran的最新时区规则(固定+03:30,无夏令时):
- Linux系统:使用包管理器更新tzdata
# Debian/Ubuntu sudo apt update && sudo apt install --only-upgrade tzdata # RHEL/CentOS/Rocky Linux sudo dnf update tzdata - Windows系统:更新系统时区设置,或下载PostgreSQL官方提供的最新tzdata文件替换到PostgreSQL的
share/timezone目录下 - 更新完成后,重启PostgreSQL服务使变更生效
2. 创建自定义固定时区(如果无法更新tzdata)
如果无法更新系统tzdata,可以手动创建一个固定偏移的自定义时区:
- 找到PostgreSQL的共享目录:
通常路径类似SELECT pg_config('sharedir');/usr/share/postgresql/xx/timezone(xx为PostgreSQL版本号) - 进入时区目录,复制一个固定偏移时区的文件(比如
Etc/GMT-3:30)并重命名:cd $(pg_config --sharedir)/timezone cp Etc/GMT-3:30 Asia/Tehran_Fixed - 编辑
Asia/Tehran_Fixed文件,确保内容仅包含固定偏移(无夏令时规则),示例内容:# Custom fixed timezone for Tehran (+03:30) Rule Tehran 2023 max - +03:30 - IRST - 在PostgreSQL中测试使用自定义时区:
SET TIMEZONE = 'Asia/Tehran_Fixed'; SELECT now(); - 若测试正常,可修改
postgresql.conf中的timezone参数为Asia/Tehran_Fixed,重启服务设置为全局默认
3. 临时会话级调整
如果仅需临时修正单个会话的时区,可直接设置固定偏移:
SET TIME ZONE '+03:30';
或在数据库连接字符串中指定:
postgresql://user:pass@host/db?options=-c%20timezone=%2B03:30
关键说明
pg_timezone_names是系统生成的视图,其数据来自底层时区文件,不支持直接UPDATE操作。所有时区规则的变更必须通过修改tzdata或创建自定义时区实现,这是PostgreSQL时区系统的设计限制。
内容的提问来源于stack exchange,提问作者ParisaN
相关产品推荐
相关产品推荐

