13

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

2013-07-23T01:18:32Z 

但相反,我得到

2013-07-23T01:18:32.000Z

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

4

5 回答 5

8

对于从谷歌来到这里的其他人。对于 Rails 4.1+ 有一个相关的问题,这里有一个更新的答案。

现在可以配置 JSON 时间编码的精度。根据Rails 升级指南,您现在可以在初始化程序中添加以下行而不是猴子补丁:

ActiveSupport::JSON::Encoding.time_precision = 3
于 2016-06-17T17:54:44.360 回答
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
于 2014-01-06T09:18:29.970 回答
6

我最近有同样的问题。

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

于 2013-08-20T17:04:45.660 回答
4

看起来这是 Rails 4 的变化

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

似乎 API 文档需要更新:(

于 2013-07-23T08:42:07.840 回答
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

于 2014-08-26T10:34:44.537 回答