diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | test/ruby/test_time.rb | 2 | ||||
-rw-r--r-- | time.c | 29 |
3 files changed, 25 insertions, 11 deletions
@@ -1,3 +1,8 @@ +Wed May 30 10:58:31 2012 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * time.c (utc_offset_arg): utc offset can be precision in seconds. + e.g. old Europe/Lisbon (c.f. [ruby-dev:40066]) + Wed May 30 06:20:29 2012 Eric Hodel <drbrain@segment7.net> * error.c (exc_set_backtrace): Updated documentation to indicate diff --git a/test/ruby/test_time.rb b/test/ruby/test_time.rb index 2648440f65..b2f099c04c 100644 --- a/test/ruby/test_time.rb +++ b/test/ruby/test_time.rb @@ -699,7 +699,7 @@ class TestTime < Test::Unit::TestCase t = T2000.getlocal("+09:00:00") assert_equal("+0900", t.strftime("%z")) assert_equal("+09:00", t.strftime("%:z")) - assert_equal("+09:00:01", t.strftime("%::z")) + assert_equal("+09:00:00", t.strftime("%::z")) assert_equal("+09", t.strftime("%:::z")) t = T2000.getlocal("+09:00:01") @@ -2111,18 +2111,27 @@ utc_offset_arg(VALUE arg) { VALUE tmp; if (!NIL_P(tmp = rb_check_string_type(arg))) { - int n; + int n = 0; char *s = RSTRING_PTR(tmp); - if (!rb_enc_str_asciicompat_p(tmp) || - RSTRING_LEN(tmp) != 6 || - (s[0] != '+' && s[0] != '-') || - !ISDIGIT(s[1]) || - !ISDIGIT(s[2]) || - s[3] != ':' || - !ISDIGIT(s[4]) || - !ISDIGIT(s[5])) + if (!rb_enc_str_asciicompat_p(tmp)) { + invalid_utc_offset: rb_raise(rb_eArgError, "\"+HH:MM\" or \"-HH:MM\" expected for utc_offset"); - n = (s[1] * 10 + s[2] - '0' * 11) * 3600; + } + switch (RSTRING_LEN(tmp)) { + case 9: + if (s[6] != ':') goto invalid_utc_offset; + if (!ISDIGIT(s[7]) || !ISDIGIT(s[8])) goto invalid_utc_offset; + n += (s[7] * 10 + s[8] - '0' * 11); + case 6: + if (s[0] != '+' && s[0] != '-') goto invalid_utc_offset; + if (!ISDIGIT(s[1]) || !ISDIGIT(s[2])) goto invalid_utc_offset; + if (s[3] != ':') goto invalid_utc_offset; + if (!ISDIGIT(s[4]) || !ISDIGIT(s[5])) goto invalid_utc_offset; + break; + default: + goto invalid_utc_offset; + } + n += (s[1] * 10 + s[2] - '0' * 11) * 3600; n += (s[4] * 10 + s[5] - '0' * 11) * 60; if (s[0] == '-') n = -n; |