diff options
author | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-07-03 00:52:43 +0000 |
---|---|---|
committer | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-07-03 00:52:43 +0000 |
commit | 59cad45f9963b359b16c1b9a9324b78e5e0873d5 (patch) | |
tree | b4647cc9b049e7ddcc4df946db04c4ed48ec23d1 /ext/psych/lib/psych/scalar_scanner.rb | |
parent | 6fe92a3cd6b4116580ff7663180407bc0c38030f (diff) |
* ext/psych/lib/psych/visitors/to_ruby.rb(visit_Psych_Nodes_Scalar):
teaching Psych to deserialize DateTime objects. [Bug #1390]
* ext/psych/lib/psych/visitors/yaml_tree.rb(visit_DateTime): added a
method for serializing DateTime objects.
* ext/psych/lib/psych/scalar_scanner.rb(parse_time): add method for
parsing times objects from a string.
* test/psych/test_date_time.rb: tests for dumping DateTime objects.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28532 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/psych/lib/psych/scalar_scanner.rb')
-rw-r--r-- | ext/psych/lib/psych/scalar_scanner.rb | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/ext/psych/lib/psych/scalar_scanner.rb b/ext/psych/lib/psych/scalar_scanner.rb index bee88de419..e65651a740 100644 --- a/ext/psych/lib/psych/scalar_scanner.rb +++ b/ext/psych/lib/psych/scalar_scanner.rb @@ -39,19 +39,7 @@ module Psych string end when TIME - date, time = *(string.split(/[ tT]/, 2)) - (yy, m, dd) = date.split('-').map { |x| x.to_i } - md = time.match(/(\d+:\d+:\d+)(\.\d*)?\s*(Z|[-+]\d+(:\d\d)?)?/) - - (hh, mm, ss) = md[1].split(':').map { |x| x.to_i } - us = (md[2] ? Rational(md[2].sub(/^\./, '0.')) : 0) * 1000000 - - time = Time.utc(yy, m, dd, hh, mm, ss, us) - - return time if 'Z' == md[3] - - tz = md[3] ? Integer(md[3].split(':').first.sub(/([-+])0/, '\1')) : 0 - Time.at((time - (tz * 3600)).to_i, us) + parse_time string when /^\d{4}-\d{1,2}-\d{1,2}$/ require 'date' Date.strptime(string, '%Y-%m-%d') @@ -86,5 +74,23 @@ module Psych string end end + + ### + # Parse and return a Time from +string+ + def parse_time string + date, time = *(string.split(/[ tT]/, 2)) + (yy, m, dd) = date.split('-').map { |x| x.to_i } + md = time.match(/(\d+:\d+:\d+)(\.\d*)?\s*(Z|[-+]\d+(:\d\d)?)?/) + + (hh, mm, ss) = md[1].split(':').map { |x| x.to_i } + us = (md[2] ? Rational(md[2].sub(/^\./, '0.')) : 0) * 1000000 + + time = Time.utc(yy, m, dd, hh, mm, ss, us) + + return time if 'Z' == md[3] + + tz = md[3] ? Integer(md[3].split(':').first.sub(/([-+])0/, '\1')) : 0 + Time.at((time - (tz * 3600)).to_i, us) + end end end |