1

我有一个问题,YAML 在 ruby​​ 1.8 和 1.9 中的工作方式不太一样。特别是在转储 DateTime 对象时。

红宝石 1.8:

require 'yaml'
YAML.dump(DateTime.now)
=> "--- 2012-06-21T14:29:02+02:00\n"

红宝石 1.9:

require 'yaml'
YAML.dump(DateTime.now)
=> "--- !ruby/object:DateTime 2012-06-21 14:29:41.874102975 +02:00\n...\n"

困扰我的是!ruby/object:DateTime标签,这很烦人。在 1.9 中使用 Time 对象解决了这个问题:

YAML.dump(DateTime.now.to_time)
=> "--- 2012-06-21 14:31:37.904841646 +02:00\n...\n"

问题是 ruby​​ 1.8 中不存在 to_times 。此外,ruby 1.8 Time 类不处理时区(不可能创建具有任意时区的 Time 对象)。

如果可能的话,我希望时间格式相同。

那我怎么能在 YAML 中转储一个 DateTime 对象呢?

4

2 回答 2

2

在 Ruby 1.9.3 中,默认的 YAML 引擎从 Syck 更改为 Psyck,但两者都可用。

红宝石 1.9

require 'yaml'
YAML::ENGINE.yamler = 'syck'
YAML.dump(DateTime.now)
 => "--- 2016-10-19T13:12:22+02:00\n" 

如果你想在 Ruby 2.0 或更高版本中使用旧的 YAML 引擎(其中 Syck 肯定被删除了),你可以使用 gem syck

红宝石 2.0:

require 'syck'
YAML.dump(DateTime.now)
 => "--- 2016-10-19T13:14:37+02:00\n"
于 2016-10-19T11:16:33.940 回答
0

一个远非完美的解决方案是:

class DateTime
  def to_yaml_time
    if DateTime.method_defined? :to_time
      # to_time is defined, and Time can be converted with timezones, perfect
      to_time
    else
      # We're a bit less lucky, but hopefully in this version of Ruby, DateTime
      # can be exported without garbage in the timestamp
      # ("!ruby/object:DateTime")
      self
    end
  end
end
于 2012-06-21T12:44:15.663 回答