From e7ff50e4b8417cef1b40c1ba6bf64dc8ce879818 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 19 Oct 2017 14:24:20 -0700 Subject: [PATCH] Make Time.parse respect timezone offset seconds DateTime.parse handles them correctly, and DateTime.parse.to_time results in the correct time. Time.parse doesn't handle them correctly because Time.zone_offset uses a different regexp that only considers hours and minutes, not seconds. --- lib/time.rb | 4 ++-- test/test_time.rb | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/time.rb b/lib/time.rb index 5179e9fee4..32b5474f5d 100644 --- a/lib/time.rb +++ b/lib/time.rb @@ -134,8 +134,8 @@ class << Time def zone_offset(zone, year=self.now.year) off = nil zone = zone.upcase - if /\A([+-])(\d\d):?(\d\d)\z/ =~ zone - off = ($1 == '-' ? -1 : 1) * ($2.to_i * 60 + $3.to_i) * 60 + if /\A([+-])(\d\d):?(\d\d)(?::?(\d\d))?\z/ =~ zone + off = ($1 == '-' ? -1 : 1) * (($2.to_i * 60 + $3.to_i) * 60 + $4.to_i) elsif /\A[+-]\d\d\z/ =~ zone off = zone.to_i * 3600 elsif ZoneOffset.include?(zone) diff --git a/test/test_time.rb b/test/test_time.rb index 398ab7279b..9d7c976abf 100644 --- a/test/test_time.rb +++ b/test/test_time.rb @@ -343,6 +343,13 @@ def test_parse_now_nil Time.parse("2000-01-01T00:00:00+11:00", nil)) end + def test_parse_offset_hour_minute_second + t = Time.at(-100000000000).utc + assert_equal(t, Time.parse("1200-02-15 BC 14:13:20-00")) + assert_equal(t, Time.parse("1200-02-15 BC 14:13:20-00:00")) + assert_equal(t, Time.parse("1200-02-15 BC 14:13:20-00:00:00")) + end + def test_parse_leap_second t = Time.utc(1998,12,31,23,59,59) assert_equal(t, Time.parse("Thu Dec 31 23:59:59 UTC 1998")) -- 2.14.2