Project

General

Profile

Actions

Bug #2675

closed

rubyspec: Date#valid_civil? should be able to handle negative months and days FAILED

Added by mame (Yusuke Endoh) over 15 years ago. Updated about 14 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 1.9.2dev (2010-01-28 trunk 26458) [i686-linux]
Backport:
[ruby-dev:40208]

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 があって、
それがうまく動かなくなっているようです。

http://github.com/rubyspec/rubyspec/blob/master/library/date/civil_spec.rb

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
=end

Actions #1

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

Actions #2

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
=end

Actions

Also available in: Atom PDF

Like0
Like0Like0