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

Ruby on Rails中修改as_json里created_at的日期格式为ISO8601

解决Ruby/Rails中created_at转为ISO8601格式的问题

针对你遇到的日期格式问题,这里有几个适配你场景的解决方案,不管是用as_json还是JBuilder都能搞定:

方案1:在as_json中直接指定格式

你可以在as_json的选项里,通过自定义逻辑覆盖created_at的默认输出,利用ActiveSupport提供的iso8601方法(带参数3可保留毫秒):

message.as_json(
  only: [:id, :body, :direction, :kind, :sent, :is_read, :created_at, :call_tag],
  methods: [:delivering?, :attach_list, :voicemail_url, :status, :status_msg],
  transform: ->(hash, record) {
    hash['created_at'] = record.created_at.iso8601(3)
    hash
  }
)

这种写法能精准修改当前场景下created_at的格式,不会影响其他地方的日期输出。

方案2:用JBuilder模板自定义输出

既然你控制器里在用JBuilder,直接在对应的.jbuilder视图文件里处理会更直观,完全摆脱as_json的默认限制:

json.extract! message, :id, :body, :direction, :kind, :sent, :is_read, :call_tag
json.created_at message.created_at.iso8601(3)
json.delivering? message.delivering?
json.attach_list message.attach_list
json.voicemail_url message.voicemail_url
json.status message.status
json.status_msg message.status_msg

这种方式能让你精确控制每个字段的输出格式,后续调整其他字段也更方便。

补充说明

  • iso8601(3)里的数字3表示保留三位小数(即毫秒),如果不需要毫秒,直接用iso8601()即可。
  • 若想全局统一日期格式,可在config/initializers/time_formats.rb中添加:
Time::DATE_FORMATS[:iso8601] = ->(time) { time.iso8601(3) }

之后在as_json里指定created_at: :iso8601即可,但这种方式会影响全局所有接口的日期输出,适合需要统一格式的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:26:58