【问题标题】:Rails ActiveSupport::TimeWithZone as_json date format issueRails ActiveSupport::TimeWithZone as_json 日期格式问题
【发布时间】:2013-07-23 08:28:02
【问题描述】:

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

2013-07-23T01:18:32Z 

但相反,我得到了

2013-07-23T01:18:32.000Z

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

【问题讨论】:

    标签: datetime ruby-on-rails-4


    【解决方案1】:

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

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

    ActiveSupport::JSON::Encoding.time_precision = 3
    

    【讨论】:

    • 简单而准确。默认情况下,在 Rails 4.1+ 中,time_precision 设置为 3。在以前的版本中,不存在此选项的情况下,它使用 0 作为默认时间精度。
    • 您可以设置time_precision = 6 来实现这一点:t = Time.current; t == Time.zone.parse(t.as_json)。否则t.usec 在序列化/反序列化之后会有所不同。使用 rails 5.1 测试
    【解决方案2】:

    如果你想恢复到没有毫秒的格式,你可以用下面的代码添加一个初始化器:

        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
    

    【讨论】:

    • 我很好奇 RoR 中的“好”缩进是什么样的。我所见过的只是人们在糟糕的时候抱怨。
    【解决方案3】:

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

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

    【讨论】:

    • 不错的发现 :) 当事情发生变化和破坏时总是很烦人
    【解决方案4】:

    看起来这是 Rails 4 的变化

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

    似乎 API 文档需要更新 :(

    【讨论】:

      【解决方案5】:

      这可能也有效

      # 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多