diff --git a/ext/date/date_parse.c b/ext/date/date_parse.c index 7349c75d84..c6f26ecb91 100644 --- a/ext/date/date_parse.c +++ b/ext/date/date_parse.c @@ -486,14 +486,14 @@ date_zone_to_diff(VALUE str) #define out_of_range(v, min, max) ((v) < (min) || (max) < (v)) hour = STRTOUL(s, &p, 10); if (*p == ':') { - if (out_of_range(sec, 0, 59)) return Qnil; + if (out_of_range(hour, 0, 23)) return Qnil; s = ++p; min = STRTOUL(s, &p, 10); if (out_of_range(min, 0, 59)) return Qnil; if (*p == ':') { s = ++p; sec = STRTOUL(s, &p, 10); - if (out_of_range(hour, 0, 23)) return Qnil; + if (out_of_range(sec, 0, 59)) return Qnil; } } else if (*p == ',' || *p == '.') { diff --git a/test/date/test_date_strptime.rb b/test/date/test_date_strptime.rb index 521bf92916..4efe1a47d0 100644 --- a/test/date/test_date_strptime.rb +++ b/test/date/test_date_strptime.rb @@ -296,6 +296,11 @@ class TestDateStrptime < Test::Unit::TestCase assert_not_nil(Date._strptime('Januari', '%B')) assert_nil(Date._strptime('Sundai,', '%A,')) assert_nil(Date._strptime('Januari,', '%B,')) + + assert_nil(Date._strptime('+24:00', '%Z')[:offset]) + assert_nil(Date._strptime('+23:60', '%Z')[:offset]) + assert_nil(Date._strptime('+23:00:60', '%Z')[:offset]) + assert_nil(Date._strptime('+23:00:60', '%Z')[:offset]) end def test_strptime