diff options
author | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-07-05 03:33:56 +0000 |
---|---|---|
committer | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-07-05 03:33:56 +0000 |
commit | ce2e7368d73b762a86690fe3531e0754301299be (patch) | |
tree | e3344d62b873a83a84bf91f24b353c6a0f2ca191 /ext/psych | |
parent | 9f56a870af1c88430a053b4e50ba39c244a4bd57 (diff) | |
download | ruby-ce2e7368d73b762a86690fe3531e0754301299be.tar.gz |
* ext/psych/lib/psych/scalar_scanner.rb (parse_string): support
timezones that are not one hour off. [ruby-core:31023]
* ext/psych/lib/psych/visitors/yaml_tree.rb: ditto
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28541 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/psych')
-rw-r--r-- | ext/psych/lib/psych/scalar_scanner.rb | 6 | ||||
-rw-r--r-- | ext/psych/lib/psych/visitors/yaml_tree.rb | 28 |
2 files changed, 17 insertions, 17 deletions
diff --git a/ext/psych/lib/psych/scalar_scanner.rb b/ext/psych/lib/psych/scalar_scanner.rb index e65651a740..e2aef65bda 100644 --- a/ext/psych/lib/psych/scalar_scanner.rb +++ b/ext/psych/lib/psych/scalar_scanner.rb @@ -88,9 +88,11 @@ module Psych time = Time.utc(yy, m, dd, hh, mm, ss, us) return time if 'Z' == md[3] + return Time.at(time.to_i, us) unless md[3] - tz = md[3] ? Integer(md[3].split(':').first.sub(/([-+])0/, '\1')) : 0 - Time.at((time - (tz * 3600)).to_i, us) + tz = md[3].split(':').map { |digit| Integer(digit.sub(/([-+])0/, '\1')) } + offset = tz.first * 3600 + ((tz[1] || 0) * 60) + Time.at((time - offset).to_i, us) end end end diff --git a/ext/psych/lib/psych/visitors/yaml_tree.rb b/ext/psych/lib/psych/visitors/yaml_tree.rb index 412acdb750..ebafffd7c9 100644 --- a/ext/psych/lib/psych/visitors/yaml_tree.rb +++ b/ext/psych/lib/psych/visitors/yaml_tree.rb @@ -136,26 +136,13 @@ module Psych end def visit_DateTime o - o = o.to_time - formatted = o.strftime("%Y-%m-%d %H:%M:%S") - if o.utc? - formatted += ".%06dZ" % [o.nsec] - else - formatted += ".%06d %+.2d:00" % [o.nsec, o.gmt_offset / 3600] - end - + formatted = format_time o.to_time tag = '!ruby/object:DateTime' @emitter.scalar formatted, nil, tag, false, false, Nodes::Scalar::ANY end def visit_Time o - formatted = o.strftime("%Y-%m-%d %H:%M:%S") - if o.utc? - formatted += ".%06dZ" % [o.nsec] - else - formatted += ".%06d %+.2d:00" % [o.nsec, o.gmt_offset / 3600] - end - + formatted = format_time o @emitter.scalar formatted, nil, nil, true, false, Nodes::Scalar::ANY end @@ -281,6 +268,17 @@ module Psych end private + def format_time time + formatted = time.strftime("%Y-%m-%d %H:%M:%S") + if time.utc? + formatted += ".%06dZ" % [time.nsec] + else + formatted += ".%06d %+.2d:%.2d" % [time.nsec, + time.gmt_offset / 3600, time.gmt_offset % 3600 / 60] + end + formatted + end + # FIXME: remove this method once "to_yaml_properties" is removed def find_ivars target loc = target.method(:to_yaml_properties).source_location.first |