Ruby哈希转JSON时如何保留含时区的完整时间戳?
如何在Ruby哈希转JSON时保留完整Active Record时间戳?
我之前也碰到过类似的问题,核心原因是Active Record的TimeWithZone对象在默认JSON序列化时会调用to_s方法,生成短格式的日期字符串,而不是我们需要的完整带时区的时间戳。下面给你几种实用的解决办法:
方法一:使用as_json替代attributes
Active Record提供了as_json方法,它会按照Rails的标准规则序列化对象,默认就会把时间转换成ISO 8601格式的完整字符串(包含日期、时间和时区信息)。修改你的代码如下:
@task_array = [] list.flatten(1).each do ... task = FactoryBot.create(taskList) @task_array << task.as_json # 这里用as_json代替attributes end print JSON.generate(@task_array)
这样转成JSON后,时间字段会变成类似 "created_at": "2020-01-04T00:00:00-06:00" 的格式,完美保留了完整时间戳和时区信息。
方法二:手动转换时间字段(如果必须用attributes)
如果你因为某些原因一定要使用attributes返回的哈希,可以手动把时间字段转换成ISO格式:
@task_array = [] list.flatten(1).each do ... task = FactoryBot.create(taskList) task_attrs = task.attributes # 手动转换时间字段为ISO 8601格式 task_attrs["created_at"] = task.created_at.iso8601 task_attrs["updated_at"] = task.updated_at.iso8601 @task_array << task_attrs end print JSON.generate(@task_array)
这种方法更灵活,适合只需要修改特定字段的场景。
为什么会出现这个问题?
你打印task.attributes时看到的是ActiveSupport::TimeWithZone对象(比如Sat, 04 Jan 2020 00:00:00 CST -06:00),但当Ruby的JSON库序列化这个哈希时,会自动调用对象的to_s方法,而TimeWithZone的默认to_s就是生成短日期格式(01/04/2020)。而as_json方法会主动把时间对象转换成符合标准的ISO字符串,避免了这个问题。
内容的提问来源于stack exchange,提问作者NewUser123
相关产品推荐
相关产品推荐

