You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何固定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,可以手动创建一个固定偏移的自定义时区:

  1. 找到PostgreSQL的共享目录:
    SELECT pg_config('sharedir');
    
    通常路径类似/usr/share/postgresql/xx/timezone(xx为PostgreSQL版本号)
  2. 进入时区目录,复制一个固定偏移时区的文件(比如Etc/GMT-3:30)并重命名:
    cd $(pg_config --sharedir)/timezone
    cp Etc/GMT-3:30 Asia/Tehran_Fixed
    
  3. 编辑Asia/Tehran_Fixed文件,确保内容仅包含固定偏移(无夏令时规则),示例内容:
    # Custom fixed timezone for Tehran (+03:30)
    Rule    Tehran   2023    max -   +03:30   -   IRST
    
  4. 在PostgreSQL中测试使用自定义时区:
    SET TIMEZONE = 'Asia/Tehran_Fixed';
    SELECT now();
    
  5. 若测试正常,可修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:42:09