Rails ActiveSupport :: TimeWithZone as_json日期格式问题

时间:2013-07-23 08:28:03

标签: datetime ruby-on-rails-4

我正在使用rails生成API,其中一些响应包含日期。 在我的数据库中,字段被设置为日期时间字段,然后这些字段变为ActiveSupport::TimeWithZone个对象。当我回复日期时间的请求时,我希望得到类似

的内容
2013-07-23T01:18:32Z 

但相反,我正在

2013-07-23T01:18:32.000Z

为什么最后会有额外的.000?现在,这正在打破我正在编写的客户端上的代码。显然我可以通过改变它期望的格式来修复客户端,但我想知道为什么rails首先会这样做,因为documentation表明它不应该有.000那里。

5 个答案:

答案 0 :(得分:7)

如果要恢复到没有毫秒的格式,可以使用以下代码添加初始化程序:

    class ActiveSupport::TimeWithZone
    #Changing the as_json method to remove the milliseconds from TimeWithZone to_json result (just like in Rails 3)
        def as_json(options = {})
            if ActiveSupport::JSON::Encoding.use_standard_json_time_format
                xmlschema
            else
                %(#{time.strftime("%Y/%m/%d %H:%M:%S")} #{formatted_offset(false)})
            end
        end
    end

答案 1 :(得分:6)

我最近遇到了同样的问题。

我找到了提交日志。 https://github.com/rails/rails/pull/9128

答案 2 :(得分:6)

来自谷歌的其他人。有一个相关的问题,Rails 4.1 + here有更新的答案。

现在可以配置JSON时间编码的精度。根据{{​​3}},您现在可以在初始化程序中添加以下行而不是猴子修补:

ActiveSupport::JSON::Encoding.time_precision = 3

答案 3 :(得分:4)

看起来这是Rails 4中的一个变化

https://github.com/rails/rails/blob/master/activesupport/lib/active_support/time_with_zone.rb#L157

似乎API文档需要更新:(

答案 4 :(得分:0)

这也可以起作用

# With ActiveSupport::JSON::Encoding.use_standard_json_time_format = true
Time.utc(2005,2,1,15,15,10).in_time_zone("Hawaii").to_json
# => "2005-02-01T05:15:10.000-10:00"

# With ActiveSupport::JSON::Encoding.use_standard_json_time_format = false
Time.utc(2005,2,1,15,15,10).in_time_zone("Hawaii").to_json
# => "2005/02/01 05:15:10 -1000"

http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html#method-i-as_json