[前][次][番号順一覧][スレッド一覧]

ruby-changes:48102

From: nobu <ko1@a...>
Date: Fri, 20 Oct 2017 10:03:23 +0900 (JST)
Subject: [ruby-changes:48102] nobu:r60216 (trunk): Make Time.parse respect timezone offset seconds

nobu	2017-10-20 10:03:18 +0900 (Fri, 20 Oct 2017)

  New Revision: 60216

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=60216

  Log:
    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.
    [ruby-core:83400] [Bug #14034]
    
    From: Jeremy Evans <code@j...>

  Modified files:
    trunk/lib/time.rb
    trunk/test/test_time.rb
Index: test/test_time.rb
===================================================================
--- test/test_time.rb	(revision 60215)
+++ test/test_time.rb	(revision 60216)
@@ -343,6 +343,13 @@ class TestTimeExtension < Test::Unit::Te https://github.com/ruby/ruby/blob/trunk/test/test_time.rb#L343
                  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"))
Index: lib/time.rb
===================================================================
--- lib/time.rb	(revision 60215)
+++ lib/time.rb	(revision 60216)
@@ -134,8 +134,8 @@ class Time https://github.com/ruby/ruby/blob/trunk/lib/time.rb#L134
     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)(?:\3(\d\d))?\z/ =~ zone
+        off = ($1 == '-' ? -1 : 1) * (($2.to_i * 60 + $4.to_i) * 60 + $5.to_i)
       elsif /\A[+-]\d\d\z/ =~ zone
         off = zone.to_i * 3600
       elsif ZoneOffset.include?(zone)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]