summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Stollsteimer <sto.mar@web.de>2017-04-13 12:38:00 +0200
committerMarcus Stollsteimer <sto.mar@web.de>2017-05-22 15:56:05 +0200
commitd2db988626a6bab441b6609a10d31e39b09fc784 (patch)
treea2e4dfeb24cdcb8308314c30a9596b331293ea1b
parent3719891f6f066c870ebc605eda55bcbfcdc44b47 (diff)
downloadpsych-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.rb2
-rw-r--r--test/psych/test_date_time.rb16
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