Rails中created_at字段转换为PST时间时报类型转换错误
报错原因
你收到no implicit conversion of ActiveSupport::TimeWithZone into String报错,是因为Rails中取出的created_at字段本身已经是ActiveSupport::TimeWithZone类型的时间对象,不是字符串格式。Time.parse方法只接受字符串类型入参,你把现成的时间对象传给它做解析,自然会触发类型转换错误。
正确实现方法
你不需要做额外的时间解析操作,直接在现成的时间对象上调用时区转换方法即可,两步就能得到你要的格式:
- 转换为太平洋时区
直接对created_at调用in_time_zone方法,传入目标时区标识:pst_time = self.created_at.in_time_zone('Pacific Time (US & Canada)') - 格式化为指定字符串样式
拿到对应时区的时间对象后,用strftime指定输出格式即可:
这个写法输出的结果就是你需要的「January 12, 2:00 PM PST」格式,不需要依赖Rails额外的本地化配置,同时会自动适配太平洋时区的夏令时切换规则。final_time_str = pst_time.strftime('%B %d, %-l:%M %p %Z')
补充说明
你之前尝试的Time.parse写法,只适用于待处理值是时间字符串的场景。Rails的ActiveRecord在从数据库读取时间字段时,已经自动完成了字符串到时间对象的转换,重复解析属于多余操作,反而会触发类型错误。
内容的提问来源于stack exchange,提问作者yellowreign
相关产品推荐
相关产品推荐

