summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortadf <tadf@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-06-21 11:42:50 +0000
committertadf <tadf@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-06-21 11:42:50 +0000
commit5b16ddf5047aa508316e7687fafd1e4870f2d687 (patch)
treee1a0f319671939c19ba0c8cc6690b8ab7596683f
parentc9aef84c7a3c075b05a89c8f9737369f7f6c2303 (diff)
* ext/date/date_core.c (datetime_s_*): canonicalize 24 o'clock.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32185 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog4
-rw-r--r--ext/date/date_core.c18
-rw-r--r--test/date/test_switch_hitter.rb15
3 files changed, 34 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 291bfabbcd..cf745159d0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Tue Jun 21 20:38:47 2011 Tadayoshi Funaba <tadf@dotrb.org>
+
+ * ext/date/date_core.c (datetime_s_*): canonicalize 24 o'clock.
+
Tue Jun 21 19:56:07 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
* internal.h: move rb_thread_io_blocking_region() declaration
diff --git a/ext/date/date_core.c b/ext/date/date_core.c
index cd2bc68e96..802188393c 100644
--- a/ext/date/date_core.c
+++ b/ext/date/date_core.c
@@ -3087,6 +3087,14 @@ s_trunc(VALUE s, VALUE *fr)
}\
}
+#define canon24oc() \
+{\
+ if (rh == 24) {\
+ rh = 0;\
+ fr2 = f_add(fr2, INT2FIX(1));\
+ }\
+}
+
#define add_frac() \
{\
if (f_nonzero_p(fr2))\
@@ -7188,6 +7196,7 @@ datetime_s_jd(int argc, VALUE *argv, VALUE klass)
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
rb_raise(rb_eArgError, "invalid date");
+ canon24oc();
decode_jd(jd, &nth, &rjd);
rjd2 = jd_local_to_utc(rjd,
@@ -7265,6 +7274,7 @@ datetime_s_ordinal(int argc, VALUE *argv, VALUE klass)
rb_raise(rb_eArgError, "invalid date");
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
rb_raise(rb_eArgError, "invalid date");
+ canon24oc();
rjd2 = jd_local_to_utc(rjd,
time_to_df(rh, rmin, rs),
@@ -7344,6 +7354,7 @@ datetime_s_civil(int argc, VALUE *argv, VALUE klass)
rb_raise(rb_eArgError, "invalid date");
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
rb_raise(rb_eArgError, "invalid date");
+ canon24oc();
ret = d_complex_new_internal(klass,
nth, 0,
@@ -7364,6 +7375,7 @@ datetime_s_civil(int argc, VALUE *argv, VALUE klass)
rb_raise(rb_eArgError, "invalid date");
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
rb_raise(rb_eArgError, "invalid date");
+ canon24oc();
rjd2 = jd_local_to_utc(rjd,
time_to_df(rh, rmin, rs),
@@ -7442,7 +7454,7 @@ datetime_s_commercial(int argc, VALUE *argv, VALUE klass)
rb_raise(rb_eArgError, "invalid date");
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
rb_raise(rb_eArgError, "invalid date");
-
+ canon24oc();
rjd2 = jd_local_to_utc(rjd,
time_to_df(rh, rmin, rs),
@@ -7513,11 +7525,11 @@ datetime_s_weeknum(int argc, VALUE *argv, VALUE klass)
rb_raise(rb_eArgError, "invalid date");
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
rb_raise(rb_eArgError, "invalid date");
+ canon24oc();
rjd2 = jd_local_to_utc(rjd,
time_to_df(rh, rmin, rs),
rof);
-
ret = d_complex_new_internal(klass,
nth, rjd2,
0, INT2FIX(0),
@@ -7582,11 +7594,11 @@ datetime_s_nth_kday(int argc, VALUE *argv, VALUE klass)
rb_raise(rb_eArgError, "invalid date");
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
rb_raise(rb_eArgError, "invalid date");
+ canon24oc();
rjd2 = jd_local_to_utc(rjd,
time_to_df(rh, rmin, rs),
rof);
-
ret = d_complex_new_internal(klass,
nth, rjd2,
0, INT2FIX(0),
diff --git a/test/date/test_switch_hitter.rb b/test/date/test_switch_hitter.rb
index 5ec94fd8e1..4294a21e9d 100644
--- a/test/date/test_switch_hitter.rb
+++ b/test/date/test_switch_hitter.rb
@@ -180,6 +180,21 @@ class TestSH < Test::Unit::TestCase
[d.year, d.mon, d.mday, d.hour, d.min, d.sec, d.offset])
end
+ def test_canon24oc
+ d = DateTime.jd(2451943,24)
+ assert_equal([2001, 2, 3, 0, 0, 0, 0],
+ [d.year, d.mon, d.mday, d.hour, d.min, d.sec, d.offset])
+ d = DateTime.ordinal(2001,33,24)
+ assert_equal([2001, 2, 3, 0, 0, 0, 0],
+ [d.year, d.mon, d.mday, d.hour, d.min, d.sec, d.offset])
+ d = DateTime.new(2001,2,2,24)
+ assert_equal([2001, 2, 3, 0, 0, 0, 0],
+ [d.year, d.mon, d.mday, d.hour, d.min, d.sec, d.offset])
+ d = DateTime.commercial(2001,5,5,24)
+ assert_equal([2001, 2, 3, 0, 0, 0, 0],
+ [d.year, d.mon, d.mday, d.hour, d.min, d.sec, d.offset])
+ end
+
def test_zone
d = Date.new(2001, 2, 3)
assert_equal(Encoding::US_ASCII, d.send(:zone).encoding)