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
相关产品推荐
相关产品推荐

