diff options
author | Marcus Stollsteimer <sto.mar@web.de> | 2017-04-13 12:38:00 +0200 |
---|---|---|
committer | Marcus Stollsteimer <sto.mar@web.de> | 2017-05-22 15:56:05 +0200 |
commit | d2db988626a6bab441b6609a10d31e39b09fc784 (patch) | |
tree | a2e4dfeb24cdcb8308314c30a9596b331293ea1b | |
parent | 3719891f6f066c870ebc605eda55bcbfcdc44b47 (diff) | |
download | psych-d2db988626a6bab441b6609a10d31e39b09fc784.tar.gz |
Preserve time zone offset when deserializing times
Fix support of time zone offsets. Now the time zone offset
will be preserved when times are deserialized from YAML with
a specified offset. Previously, times other than UTC ("Z")
where converted to local time.
The test cases use two different offsets to account for the
possibility of an erratic success when the tests are run in
the corresponding time zone.
-rw-r--r-- | lib/psych/scalar_scanner.rb | 2 | ||||
-rw-r--r-- | test/psych/test_date_time.rb | 16 |
2 files changed, 17 insertions, 1 deletions
diff --git a/lib/psych/scalar_scanner.rb b/lib/psych/scalar_scanner.rb index 449efa4..67c0cc3 100644 --- a/lib/psych/scalar_scanner.rb +++ b/lib/psych/scalar_scanner.rb @@ -143,7 +143,7 @@ module Psych offset += ((tz[1] || 0) * 60) end - klass.at((time - offset).to_i, us) + klass.new(yy, m, dd, hh, mm, ss+us/(1_000_000r), offset) end end end diff --git a/test/psych/test_date_time.rb b/test/psych/test_date_time.rb index 7745eb4..3c8b436 100644 --- a/test/psych/test_date_time.rb +++ b/test/psych/test_date_time.rb @@ -19,6 +19,14 @@ module Psych assert_cycle time end + def test_timezone_offset + times = [Time.new(2017, 4, 13, 12, 0, 0, "+09:00"), + Time.new(2017, 4, 13, 12, 0, 0, "-05:00")] + cycled = Psych::load(Psych.dump times) + assert_match(/12:00:00 \+0900/, cycled.first.to_s) + assert_match(/12:00:00 -0500/, cycled.last.to_s) + end + def test_new_datetime assert_cycle DateTime.new end @@ -28,6 +36,14 @@ module Psych assert_cycle dt end + def test_datetime_timezone_offset + times = [DateTime.new(2017, 4, 13, 12, 0, 0, "+09:00"), + DateTime.new(2017, 4, 13, 12, 0, 0, "-05:00")] + cycled = Psych::load(Psych.dump times) + assert_match(/12:00:00\+09:00/, cycled.first.to_s) + assert_match(/12:00:00-05:00/, cycled.last.to_s) + end + def test_invalid_date assert_cycle "2013-10-31T10:40:07-000000000000033" end |