diff --git a/ChangeLog b/ChangeLog index cad4cff7ae..9ceaca2094 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Mon May 5 01:12:27 2014 Tadayoshi Funaba + + * ext/date/date_core.c (rt_rewrite_frags): a new feature (not a + bug fix) of strptime. applies offset even if the given date is + not local time (%s and %Q). This is an exceptional feature and + I do NOT recommend to use this at all. Thank you git community. + Sun May 4 20:51:32 2014 Tanaka Akira * lib/time.rb (Time.force_zone!): Use usual local time if it has diff --git a/ext/date/date_core.c b/ext/date/date_core.c index 1685d15e61..ee360b4afb 100644 --- a/ext/date/date_core.c +++ b/ext/date/date_core.c @@ -1,5 +1,5 @@ /* - date_core.c: Coded by Tadayoshi Funaba 2010-2013 + date_core.c: Coded by Tadayoshi Funaba 2010-2014 */ #include "ruby.h" @@ -3667,7 +3667,11 @@ rt_rewrite_frags(VALUE hash) seconds = ref_hash("seconds"); if (!NIL_P(seconds)) { - VALUE d, h, min, s, fr; + VALUE offset, d, h, min, s, fr; + + offset = ref_hash("offset"); + if (!NIL_P(offset)) + seconds = f_add(seconds, offset); d = f_idiv(seconds, INT2FIX(DAY_IN_SECONDS)); fr = f_mod(seconds, INT2FIX(DAY_IN_SECONDS)); @@ -3687,7 +3691,6 @@ rt_rewrite_frags(VALUE hash) set_hash("sec", s); set_hash("sec_fraction", fr); del_hash("seconds"); - del_hash("offset"); } return hash; } diff --git a/test/date/test_date_strptime.rb b/test/date/test_date_strptime.rb index 40d4e22a72..5270bc3c1c 100644 --- a/test/date/test_date_strptime.rb +++ b/test/date/test_date_strptime.rb @@ -493,4 +493,21 @@ class TestDateStrptime < Test::Unit::TestCase assert_equal(s0, s) end + def test_sz + d = DateTime.strptime('0 -0200', '%s %z') + assert_equal([1969, 12, 31, 22, 0, 0], [d.year, d.mon, d.mday, d.hour, d.min, d.sec]) + assert_equal(Rational(-2, 24), d.offset) + d = DateTime.strptime('9 +0200', '%s %z') + assert_equal([1970, 1, 1, 2, 0, 9], [d.year, d.mon, d.mday, d.hour, d.min, d.sec]) + assert_equal(Rational(2, 24), d.offset) + + d = DateTime.strptime('0 -0200', '%Q %z') + assert_equal([1969, 12, 31, 22, 0, 0], [d.year, d.mon, d.mday, d.hour, d.min, d.sec]) + assert_equal(Rational(-2, 24), d.offset) + d = DateTime.strptime('9000 +0200', '%Q %z') + assert_equal([1970, 1, 1, 2, 0, 9], [d.year, d.mon, d.mday, d.hour, d.min, d.sec]) + assert_equal(Rational(2, 24), d.offset) + + end + end