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

RSpec测试更新Rails时区报错:Postgres不识别指定时区

Postgres时区识别问题的解决方法

这个错误确实是Postgres导致的——Postgres使用IANA时区数据库的标准标识符,而非你用的"Central Time (US & Canada)"这类Windows风格的显示名称,所以无法识别该字符串。另外CDT(Central Daylight Time)是夏令时标识,属于America/Chicago时区的夏令时段,Postgres会根据日期自动切换夏令时/标准时间,不需要单独指定CDT。

  • 确认Postgres支持的时区列表
    可以在psql终端执行:

    SELECT name, abbrev FROM pg_timezone_names WHERE name LIKE '%Chicago%';
    

    或者在Rails控制台查询:

    ActiveRecord::Base.connection.execute("SELECT name, abbrev FROM pg_timezone_names WHERE name LIKE '%Chicago%'").to_a
    

    你会看到America/Chicago对应的缩写包含CDT(夏令时)和CST(标准时间),这就是你要的美加中部时区。

  • 修改代码中的时区值
    直接使用Postgres识别的标准时区名赋值:

    a.timezone = "America/Chicago"
    
  • 兼容旧时区名称(可选)
    如果你的系统需要接收用户输入的Windows风格时区名,可以在模型中添加映射转换逻辑:

    class YourModel < ApplicationRecord
      TIMEZONE_MAPPING = {
        "Central Time (US & Canada)" => "America/Chicago",
        "Eastern Time (US & Canada)" => "America/New_York",
        # 按需添加其他映射
      }
    
      def timezone=(value)
        mapped_value = TIMEZONE_MAPPING.fetch(value, value)
        super(mapped_value)
      end
    end
    
  • 检查Postgres时区配置(可选)
    若遇到大范围时区无法识别的情况,可检查Postgres的全局配置:
    在psql中执行SHOW timezone;确认全局时区设置,SHOW timezone_abbreviations;查看支持的时区缩写列表。默认情况下Postgres会完整加载IANA时区数据库,无需额外配置,除非是自定义编译的版本限制了时区范围。

内容的提问来源于stack exchange,提问作者boddhisattva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:45:01