如何使用Ruby自动将JSON时间字符串转换为时间对象



当我使用ruby消耗web服务API时,我希望它们自动转换为 Time对象(或 DateTime objects(,这样我就没有我自己手动做。

例如,我希望它输出Time而不是String

irb(main):001:0> require 'json'
=> true
irb(main):002:0> payload = JSON.generate({ now: Time.now })
=> "{"now":"2018-04-02 13:15:56 -0500"}"
irb(main):003:0> JSON.parse(payload)['now'].class
=> String

我知道,时间不是JSON规格的一部分。我只是想知道是否有一种方法可以配置Ruby的Stdlib Json Parser自动解析日期,或者是否有库为您做到这一点。

主动支持可以自动将ISO 8601格式化时间转换为ActiveSupport::TimeWithZone对象,当您设置ActiveSupport.parse_json_times = true

http://api.rubyonrails.org/classes/activeupport/json.html

#!/usr/bin/env ruby
require 'active_support/json'
require 'active_support/time'
Time.zone = 'UTC'
ActiveSupport.parse_json_times = true
puts payload1 = JSON.generate({ now: Time.now })
puts payload2 = ActiveSupport::JSON.encode({ now: Time.now })
puts ActiveSupport::JSON.decode(payload1)['now'].class
puts ActiveSupport::JSON.decode(payload2)['now'].class

将输出:

{"now":"2018-04-02 13:19:40 -0500"}
{"now":"2018-04-02T13:19:40.291-05:00"}
String
ActiveSupport::TimeWithZone

请注意,Ruby Stdlib的默认时间是如何通过主动支持来解析的。只有ISO 8601格式的时间才能成功转换。主动支持使用正则探测时间。您可以阅读测试,以了解其支持的时间格式。看起来它支持ISO 8601,但不是支持unix/posix/epoch时间戳。

当我针对Rails创建此问题时,我被告知了此功能。

一些历史记录:时间解析曾经是导轨中的默认行为,但是随后为想要关闭它的人添加了ActiveSupport.parse_json_times,然后默认情况下它已将其关闭,所以现在您必须选择它。<<<<<<<<<<<<<<<<<</p>

最新更新