YAML and DateTime

P

Paul McMahon

It seems that cannot store instances of DateTime, but instead stores the=
m =

as Time.

irb(main):001:0> require "yaml"
=3D> true
irb(main):003:0> YAML.load(DateTime.now.to_yaml).class
=3D> Time

This causes issues when you have a DateTime that is out of range of Time=


irb(main):005:0> date_time =3D DateTime.new(2041,1,1)
=3D> #<DateTime: 4933041/2,0,2299161>
irb(main):006:0> YAML.load(date_time.to_yaml)
ArgumentError: time out of range
from /usr/local/lib/ruby/1.8/yaml.rb:133:in `utc'
from /usr/local/lib/ruby/1.8/yaml.rb:133:in `node_import'
from /usr/local/lib/ruby/1.8/yaml.rb:133:in `load'
from /usr/local/lib/ruby/1.8/yaml.rb:133:in `load'
from (irb):6

Does anyone have a fix or workaround for this?

Thanks,

Paul McMahon
 
J

Juan Matias

There's a workarount you can do,
in /usr/local/lib/ruby/1.8/yaml/rubytypes.rb you have this definition of
#to_yaml on Date class.

1 class Date
2 yaml_as "tag:yaml.org,2002:timestamp#ymd"
3 def to_yaml( opts = {} )
4 YAML::quick_emit( self, opts ) do |out|
5 out.scalar( "tag:yaml.org,2002:timestamp", self.to_s, :plain )
6 end
7 end
8 end

What I do in my Rails app is to overide this implementation,

1 class Date
2 yaml_as "tag:yaml.org,2002:timestamp#ymd"
3 def to_yaml( opts = {} )
4 YAML::quick_emit( self, opts ) do |out|
5 out.scalar( "tag:yaml.org,2002:timestamp", self.to_s:)utc), :plain
)
6 end
7 end
8 end

"self.to_s:)utc)" is the difference in line 5.It works for me.

I hope this help.
Bye.
Juan Matias.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,567
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top