Bug #2675
closedrubyspec: Date#valid_civil? should be able to handle negative months and days FAILED
Description
=begin
ふなばさん
遠藤です。
まず確認ですが、valid_civil? が jd or nil を返すという仕様から
true or false を返すようになったのは 1.9 から (というか Date2
から?) の仕様変更ですよね。
その点を修正した上で、rubyspec が以下の挙動の変化を検出しました。
$ ruby18 -v -rdate -e 'p Date.valid_civil?(1582, -3, -18)'
ruby 1.8.8dev (2010-01-26 revision 26430) [i686-linux]
nil
$ ./ruby -v -rdate -e 'p Date.valid_civil?(1582, -3, -18)'
ruby 1.9.2dev (2010-01-28 trunk 26458) [i686-linux]
true
$ ruby-1.9.1-p378 -v -rdate -e 'p Date.valid_civil?(1582, -3, -18)'
ruby 1.9.1p378 (2010-01-10 revision 26273) [i686-linux]
true
「Date の月日に負の値を入れても動く」という spec があって、
それがうまく動かなくなっているようです。
date.rb の _valid_civil? のコメントによると、負の値でも動く
ようなことが書かれていますので、これはバグでしょうか。
# +m+ and +d+ can be negative, in which case they count
# backwards from the end of the year and the end of the
# month respectively.
--
Yusuke ENDOH [email protected]
=end
Updated by tadf (tadayoshi funaba) over 15 years ago
=begin
まず確認ですが、valid_civil? が jd or nil を返すという仕様から
true or false を返すようになったのは 1.9 から (というか Date2
から?) の仕様変更ですよね。
はい。
その点を修正した上で、rubyspec が以下の挙動の変化を検出しました。
晦日からの数えかたの変更です。1.8 では以下のようになっていて、飛んだと
ころにも日を割り当てられているかのように数えていました。
October 1582¶
S M Tu W Th F S¶
-31 -30 -29 -28 -17 -16¶
-15 -14 -13 -12 -11 -10 -9¶
-8 -7 -6 -5 -4 -3 -2¶
-1¶
1.9 では、
October 1582¶
S M Tu W Th F S¶
-21 -20 -19 -18 -17 -16¶
-15 -14 -13 -12 -11 -10 -9¶
-8 -7 -6 -5 -4 -3 -2¶
-1¶
のように本当に存在するものだけ数えるようにしています。どっちが正しいと
いうわけではないのですが、このような例外的なところでの挙動を選択しなれ
ばなりません。年の日のほうのあつかいと揃えるとともに、このほうが都合が
よいのでそうしました。
したがって、1582年-3月-18日は、1.8 では存在するが、1.9 では存在しないと
いうことになります。
=end
Updated by mame (Yusuke Endoh) over 15 years ago
- Status changed from Open to Rejected
- ruby -v set to ruby 1.9.2dev (2010-01-28 trunk 26458) [i686-linux]
=begin
したがって、1582年-3月-18日は、1.8 では存在するが、1.9 では存在しないと
いうことになります。
説明ありがとうございます!わかりました。
聞かないと到底わかりそうになかったです。
このチケットは reject しつつ、以下のようなパッチを rubyspec に
送ろうと思います。
diff --git a/library/date/civil_spec.rb b/library/date/civil_spec.rb
index e26968c..d169cc2 100644
--- a/library/date/civil_spec.rb
+++ b/library/date/civil_spec.rb
@@ -10,19 +10,56 @@ end
describe "Date#valid_civil?" do
- it "should be able to determine if a date is valid" do
- Date.valid_civil?(1582, 10, 14).should == nil
- Date.valid_civil?(1582, 10, 15).should == Date.civil(1582, 10, 15).jd
- Date.valid_civil?(1582, 10, 14, Date::ENGLAND).should_not == nil
- Date.valid_civil?(1582, 10, 14, Date::ENGLAND).should == Date.civil(1582, 10, 14, Date::ENGLAND).jd
- ruby_version_is "" ... "1.9" do
- it "should be able to determine if a date is valid" do
-
Date.valid_civil?(1582, 10, 14).should == nil
-
Date.valid_civil?(1582, 10, 15).should == Date.civil(1582, 10, 15).jd
-
Date.valid_civil?(1582, 10, 14, Date::ENGLAND).should_not == nil
-
Date.valid_civil?(1582, 10, 14, Date::ENGLAND).should == Date.civil(1582, 10, 14, Date::ENGLAND).jd
- end
- it "should be able to handle negative months and days" do
-
# October 1582
-
# S M Tu W Th F S
-
# -31 -30 -29 -28 -17 -16
-
# -15 -14 -13 -12 -11 -10 -9
-
# -8 -7 -6 -5 -4 -3 -2
-
# -1
-
Date.valid_civil?(1582, -3, -31).should == Date.civil(1582, 10, 1).jd
-
Date.valid_civil?(1582, -3, -28).should == Date.civil(1582, 10, 4).jd
-
Date.valid_civil?(1582, -3, -27).should == nil
-
Date.valid_civil?(1582, -3, -22).should == nil
-
Date.valid_civil?(1582, -3, -21).should == nil
-
Date.valid_civil?(1582, -3, -18).should == nil
-
Date.valid_civil?(1582, -3, -17).should == Date.civil(1582, 10, 15).jd
-
Date.valid_civil?(2007, -11, -10).should == Date.civil(2007, 2, 19).jd
-
Date.valid_civil?(2008, -11, -10).should == Date.civil(2008, 2, 20).jd
- end
end
- it "should be able to handle negative months and days" do
- Date.valid_civil?(1582, -3, -18).should == nil
- Date.valid_civil?(1582, -3, -17).should == Date.civil(1582, 10, 15).jd
- ruby_version_is "1.9" do
- it "should be able to determine if a date is valid" do
-
Date.valid_civil?(1582, 10, 14).should == false
-
Date.valid_civil?(1582, 10, 15).should == true
-
Date.valid_civil?(1582, 10, 14, Date::ENGLAND).should == true
- end
- it "should be able to handle negative months and days" do
-
# October 1582
-
# S M Tu W Th F S
-
# -21 -20 -19 -18 -17 -16
-
# -15 -14 -13 -12 -11 -10 -9
-
# -8 -7 -6 -5 -4 -3 -2
-
# -1
-
Date.valid_civil?(1582, -3, -22).should == false
-
Date.valid_civil?(1582, -3, -21).should == true
-
Date.valid_civil?(1582, -3, -18).should == true
-
Date.valid_civil?(1582, -3, -17).should == true
- Date.valid_civil?(2007, -11, -10).should == Date.civil(2007, 2, 19).jd
- Date.valid_civil?(2008, -11, -10).should == Date.civil(2008, 2, 20).jd
-
Date.valid_civil?(2007, -11, -10).should == true
-
Date.valid_civil?(2008, -11, -10).should == true
- end
end
end
--
Yusuke Endoh [email protected]
=end