1

問題があります。YAMLはruby1.8と1.9でまったく同じようには機能しません。特にDateTimeオブジェクトをダンプする場合。

Ruby 1.8:

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

Ruby 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"

問題は、to_timesがruby1.8に存在しないことです。さらに、ruby 1.8 Timeクラスはタイムゾーンを処理しません(任意のタイムゾーンでTimeオブジェクトを作成することはできません)。

可能であれば、時間形式を同じにしたいと思います。

では、どうすればDateTimeオブジェクトをYAMLにダンプできますか?

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 以降 (Syck は確実に削除されています) で古い YAML エンジンを使用する場合は、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 に答える