From: "NARUSE, Yui" Date: 2011-06-21T13:09:15+09:00 Subject: [ruby-dev:43861] Date/DateTimeの仕様について ふなばさん 成瀬です。 RubySpec を眺めていていくつか気づいたことがあるので質問させてください。 まず、DateTime.new の第3~6引数に端数を与えた場合ですが、 irb(main):002:0> DateTime.new(4172,1,1,Rational(1,2)) => # irb(main):003:0> DateTime.new(4172,1,1,Rational(1,2),0) ArgumentError: invalid fraction irb(main):004:0> DateTime.new(4172,1,1,1.5) => # irb(main):005:0> DateTime.new(4172,1,1,1.5,0) ArgumentError: invalid fraction 以上は 1.9.2 では全て通るのですが、仕様変更でしょうか。 以下のパッチを当てると以前の挙動に戻るようですが。 diff --git a/ext/date/date_core.c b/ext/date/date_core.c index cd2bc68..0ae553b 100644 --- a/ext/date/date_core.c +++ b/ext/date/date_core.c @@ -3071,8 +3071,6 @@ s_trunc(VALUE s, VALUE *fr) {\ s = s##_trunc(v##s, &fr);\ if (f_nonzero_p(fr)) {\ - if (argc > n)\ - rb_raise(rb_eArgError, "invalid fraction");\ fr2 = fr;\ }\ } @@ -3081,8 +3079,6 @@ s_trunc(VALUE s, VALUE *fr) {\ s = NUM2INT(s##_trunc(v##s, &fr));\ if (f_nonzero_p(fr)) {\ - if (argc > n)\ - rb_raise(rb_eArgError, "invalid fraction");\ fr2 = fr;\ }\ } 次に、DateTime.newの第4引数に24を与えた場合について、 irb(main):002:0> DateTime.new(4172,1,1,23) => # DateTime.new(4172,1,1,24) => # irb(main):002:0> DateTime.new(4172,1,1,24).hour => 24 irb(main):003:0> DateTime.new(4172,1,1,24).day => 1 irb(main):004:0> DateTime.new(4172,1,2) => # 以前から引数としてhour=24のみ許されているんですが(閏秒対策?)、 現在は繰り上がらないようになっています。 これ自体は仕様変更ならばそれでいいのですが、 だとしても inspect 結果がおかしいように見えます。 なお、1.9.2 だと以下のとおり両方とも翌日0時になります。 irb(main):002:0> DateTime.new(4172,1,1,24) => # irb(main):003:0> DateTime.new(4172,1,2,0) => # irb(main):002:0> DateTime.new(4172,1,1,24).hour => 0 irb(main):003:0> DateTime.new(4172,1,1,24).day => 2 -- NARUSE, Yui