From 18805586d9a524f0a351a1affd950e50166ed5e0 Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 30 May 2012 01:58:34 +0000 Subject: [PATCH] utc offset in seconds * time.c (utc_offset_arg): utc offset can be precision in seconds. e.g. old Europe/Lisbon (c.f. [ruby-dev:40066]) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35842 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ test/ruby/test_time.rb | 2 +- time.c | 29 +++++++++++++++++++---------- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8c0bf9695f..a77ab60fbc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Wed May 30 10:58:31 2012 Nobuyoshi Nakada + + * 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 * 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") diff --git a/time.c b/time.c index 0e0e01cf8d..b0a2be2455 100644 --- a/time.c +++ b/time.c @@ -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;