Project

General

Profile

Actions

Bug #2676

closed

behavior change of some methods of Date between 1.8 and 1.9

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

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

Description

=begin
ふなばさん
遠藤です。

rubyspec が Date に関する動作の違いを見つけまくってくれるんですが、
Date の知識がなくてバグかどうか判断できません。
すみませんが以下の動作の違いをチェックしていただけますでしょうか。

ruby18 はすべて ruby 1.8.8dev (2010-01-26 revision 26430) [i686-linux] で、
ruby19 はすべて ruby 1.9.2dev (2010-01-28 trunk 26458) [i686-linux] です。
ruby-1.9.1-p378

  1. Date.valid_commercial? の返す値の真偽が変わった?
    $ ruby18 -rdate -e 'p Date.valid_commercial?(1582, 41, 4)'
    nil

$ ruby19 -rdate -e 'p Date.valid_commercial?(1582, 41, 4)'
true

  1. Date.ordinal の範囲が変わった?
    $ ruby18 -rdate -e 'p Date.ordinal(1582, 287).day'
    /home/mame/work/ruby18/local/lib/ruby/1.8/date.rb:732:in `ordinal':
    invalid date (ArgumentError)
    from -e:1

$ ruby19 -rdate -e 'p Date.ordinal(1582, 287).day'
24

  1. Date.ordinal の範囲が変わった? (その 2)
    $ ruby18 -rdate -e 'p Date.ordinal(1582, 288).day'
    15
    $ ruby19 -rdate -e 'p Date.ordinal(1582, 288).day'
    25

  2. Date.valid_ordinal? の範囲が変わった? (その 3)
    $ ruby18 -rdate -e 'p Date.valid_ordinal?(1582, 287)'
    nil

$ ruby19 -rdate -e 'p Date.valid_ordinal?(1582, 287)'
true

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

--
Yusuke ENDOH
=end

Actions #1

Updated by tadf (tadayoshi funaba) over 14 years ago

=begin

  1. Date.valid_commercial? の返す値の真偽が変わった?
    $ ruby18 -rdate -e 'p Date.valid_commercial?(1582, 41, 4)'
    nil

$ ruby19 -rdate -e 'p Date.valid_commercial?(1582, 41, 4)'
true

はい。

  1. Date.ordinal の範囲が変わった?
    $ ruby18 -rdate -e 'p Date.ordinal(1582, 287).day'
    /home/mame/work/ruby18/local/lib/ruby/1.8/date.rb:732:in `ordinal':
    invalid date (ArgumentError)
    from -e:1

$ ruby19 -rdate -e 'p Date.ordinal(1582, 287).day'
24

はい。前のメールで書いたのと同じことです。

$ ./ruby -I lib sample/cal.rb -c it -j 10 1582 # 1.8
October 1582
S M Tu W Th F S
274 275 276 277 288 289
290 291 292 293 294 295 296
297 298 299 300 301 302 303
304

$ ./ruby -I lib sample/cal.rb -c it -j 10 1582 # 1.9
October 1582
S M Tu W Th F S
274 275 276 277 278 279
280 281 282 283 284 285 286
287 288 289 290 291 292 293
294

  1. Date.ordinal の範囲が変わった? (その 2)
    $ ruby18 -rdate -e 'p Date.ordinal(1582, 288).day'
    15
    $ ruby19 -rdate -e 'p Date.ordinal(1582, 288).day'
    25

はい。

$ ./ruby -I lib sample/cal.rb -c it 10 1582 # 1.8
October 1582
S M Tu W Th F S
1 2 3 4 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

$ ./ruby -I lib sample/cal.rb -c it 10 1582 # 1.9
October 1582
S M Tu W Th F S
1 2 3 4 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

  1. Date.valid_ordinal? の範囲が変わった? (その 3)
    $ ruby18 -rdate -e 'p Date.valid_ordinal?(1582, 287)'
    nil

$ ruby19 -rdate -e 'p Date.valid_ordinal?(1582, 287)'
true

はい。

=end

Actions #2

Updated by mame (Yusuke Endoh) over 14 years ago

  • Status changed from Open to Rejected
  • ruby -v set to ruby 1.9.2dev (2010-01-28 trunk 26458) [i686-linux]

=begin
遠藤です。

お返事ありがとうございます。

2010年1月28日22:50 Tadayoshi Funaba :

  1. Date.valid_commercial? の返す値の真偽が変わった?
    $ ruby18 -rdate -e 'p Date.valid_commercial?(1582, 41, 4)'
    nil

$ ruby19 -rdate -e 'p Date.valid_commercial?(1582, 41, 4)'
true

はい。

わかりました。
確認ですが、1.8 だと 1582-10-04 以前の commercial date は扱えない
(1581 年以前も含めて) ということでいいでしょうか。

  1. Date.ordinal の範囲が変わった?
    $ ruby18 -rdate -e 'p Date.ordinal(1582, 287).day'
    /home/mame/work/ruby18/local/lib/ruby/1.8/date.rb:732:in `ordinal':
    invalid date (ArgumentError)
    from -e:1

$ ruby19 -rdate -e 'p Date.ordinal(1582, 287).day'
24

はい。前のメールで書いたのと同じことです。

他もわかったと思います。ありがとうございます。

わかったといいつつ書くのに苦労したパッチ:

diff --git a/library/date/commercial_spec.rb b/library/date/commercial_spec.rb
index c960ed7..9367470 100644
--- a/library/date/commercial_spec.rb
+++ b/library/date/commercial_spec.rb
@@ -10,20 +10,65 @@ end

describe "Date#valid_commercial?" do

  • it "should be able to determine if the date is a valid commercial date" do
  • Date.valid_commercial?(1582, 41, 4).should == nil
  • Date.valid_commercial?(1582, 41, 5).should == Date.civil(1582, 10, 15).jd
  • valid_commercial? can't handle dates before the Gregorian calendar

  • Date.valid_commercial?(1582, 41, 4, Date::ENGLAND).should == nil
  • Date.valid_commercial?(1752, 37, 4, Date::ENGLAND).should == Date.civil(1752, 9, 14, Date::ENGLAND).jd
  • ruby_version_is "" ... "1.9" do
  • it "should be able to determine if the date is a valid commercial date" do
  •  # October 1582
    
  •  #      M Tu  W Th  F Sa Su
    
  •  # 41:  -  -  -  -  5  6  7
    
  •  # 42:  1  2  3  4  5  6  7
    
  •  # 43:  1  2  3  4  5  6  7
    
  •  # 44:  1
    
  •  Date.valid_commercial?(1582, 41, 4).should == nil
    
  •  Date.valid_commercial?(1582, 41, 5).should == Date.civil(1582, 10, 15).jd
    
  •  # valid_commercial? can't handle dates before the Gregorian calendar
    
  •  Date.valid_commercial?(1582, 41, 4, Date::ENGLAND).should == nil
    
  •  Date.valid_commercial?(1752, 37, 4, Date::ENGLAND).should == Date.civil(1752, 9, 14, Date::ENGLAND).jd
    
  • end
  • it "should be able to handle negative week and day numbers" do
  •  # October 1582
    
  •  #       M Tu  W Th  F Sa Su
    
  •  # -12:  -  -  -  - -3 -2 -1
    
  •  # -11: -7 -6 -5 -4 -3 -2 -1
    
  •  # -10: -7 -6 -5 -4 -3 -2 -1
    
  •  #  -9: -7
    
  •  Date.valid_commercial?(1582, -12, -4).should == nil
    
  •  Date.valid_commercial?(1582, -12, -3).should == Date.civil(1582, 10, 15).jd
    
  •  Date.valid_commercial?(2007, -44, -2).should == Date.civil(2007, 3, 3).jd
    
  •  Date.valid_commercial?(2008, -44, -2).should == Date.civil(2008, 3, 1).jd
    
  • end
    end
  • it "should be able to handle negative week and day numbers" do
  • Date.valid_commercial?(1582, -12, -4).should == nil
  • Date.valid_commercial?(1582, -12, -3).should == Date.civil(1582, 10, 15).jd
  • Date.valid_commercial?(2007, -44, -2).should == Date.civil(2007, 3, 3).jd
  • Date.valid_commercial?(2008, -44, -2).should == Date.civil(2008, 3, 1).jd
  • ruby_version_is "1.9" do
  • it "should be able to determine if the date is a valid commercial date" do
  •  # October 1582
    
  •  #      M Tu  W Th  F Sa Su
    
  •  # 39   1  2  3  4  5  6  7
    
  •  # 40:  1  2  3  4  5  6  7
    
  •  # 41:  1  2  3  4  5  6  7
    
  •  # 42:  1
    
  •  Date.valid_commercial?(1582, 39, 4).should == true
    
  •  Date.valid_commercial?(1582, 39, 5).should == true
    
  •  Date.valid_commercial?(1582, 41, 4).should == true
    
  •  Date.valid_commercial?(1582, 41, 5).should == true
    
  •  Date.valid_commercial?(1582, 41, 4, Date::ENGLAND).should == true
    
  •  Date.valid_commercial?(1752, 37, 4, Date::ENGLAND).should == true
    
  • end
  • it "should be able to handle negative week and day numbers" do
  •  # October 1582
    
  •  #       M Tu  W Th  F Sa Su
    
  •  # -12: -7 -6 -5 -4 -3 -2 -1
    
  •  # -11: -7 -6 -5 -4 -3 -2 -1
    
  •  # -10: -7 -6 -5 -4 -3 -2 -1
    
  •  #  -9: -7
    
  •  Date.valid_commercial?(1582, -12, -4).should == true
    
  •  Date.valid_commercial?(1582, -12, -3).should == true
    
  •  Date.valid_commercial?(2007, -44, -2).should == true
    
  •  Date.valid_commercial?(2008, -44, -2).should == true
    
  • end
    end

end
diff --git a/library/date/ordinal_spec.rb b/library/date/ordinal_spec.rb
index 2169d8b..46cefc7 100644
--- a/library/date/ordinal_spec.rb
+++ b/library/date/ordinal_spec.rb
@@ -4,26 +4,98 @@ require File.dirname(FILE) + '/shared/commercial'

describe "Date#ordinal" do

  • it "should be able to construct a Date object from an ordinal date" do
  • lambda { Date.ordinal(1582, 287) }.should raise_error(ArgumentError)
  • Date.ordinal(1582, 288).should == Date.civil(1582, 10, 15)
  • Date.ordinal(1582, 287, Date::ENGLAND).should == Date.civil(1582, 10, 14, Date::ENGLAND)
  • ruby_version_is "" ... "1.9" do
  • it "should be able to construct a Date object from an ordinal date" do
  •  # October 1582
    
  •  #   S   M  Tu   W  Th   F   S
    
  •  #     274 275 276 277 288 289
    
  •  # 290 291 292 293 294 295 296
    
  •  # 297 298 299 300 301 302 303
    
  •  # 304
    
  •  Date.ordinal(1582, 274).should == Date.civil(1582, 10,  1)
    
  •  Date.ordinal(1582, 277).should == Date.civil(1582, 10,  4)
    
  •  lambda { Date.ordinal(1582, 278) }.should raise_error(ArgumentError)
    
  •  lambda { Date.ordinal(1582, 287) }.should raise_error(ArgumentError)
    
  •  Date.ordinal(1582, 288).should == Date.civil(1582, 10, 15)
    
  •  Date.ordinal(1582, 287, Date::ENGLAND).should == Date.civil(1582, 10, 14, Date::ENGLAND)
    
  • end
  • end
  • ruby_version_is "1.9" do
  • it "should be able to construct a Date object from an ordinal date" do
  •  # October 1582
    
  •  #   S   M  Tu   W  Th   F   S
    
  •  #     274 275 276 277 278 279
    
  •  # 280 281 282 283 284 285 286
    
  •  # 287 288 289 290 291 292 293
    
  •  # 294
    
  •  Date.ordinal(1582, 274).should == Date.civil(1582, 10,  1)
    
  •  Date.ordinal(1582, 277).should == Date.civil(1582, 10,  4)
    
  •  Date.ordinal(1582, 278).should == Date.civil(1582, 10, 15)
    
  •  Date.ordinal(1582, 287, Date::ENGLAND).should == Date.civil(1582, 10, 14, Date::ENGLAND)
    
  • end
    end

end

describe "Date#valid_ordinal?" do

  • it "should be able to determine if the date is a valid ordinal date" do
  • Date.valid_ordinal?(1582, 287).should == nil
  • Date.valid_ordinal?(1582, 288).should == Date.civil(1582, 10, 15).jd
  • Date.valid_ordinal?(1582, 287, Date::ENGLAND).should_not == nil
  • Date.valid_ordinal?(1582, 287, Date::ENGLAND).should == Date.civil(1582, 10, 14, Date::ENGLAND).jd
  • ruby_version_is "" ... "1.9" do
  • it "should be able to determine if the date is a valid ordinal date" do
  •  # October 1582
    
  •  #   S   M  Tu   W  Th   F   S
    
  •  #     274 275 276 277 278 279
    
  •  # 280 281 282 283 284 285 286
    
  •  # 287 288 289 290 291 292 293
    
  •  # 294
    
  •  Date.valid_ordinal?(1582, 277).should == Date.civil(1582, 10,  4).jd
    
  •  Date.valid_ordinal?(1582, 278).should == nil
    
  •  Date.valid_ordinal?(1582, 287).should == nil
    
  •  Date.valid_ordinal?(1582, 288).should == Date.civil(1582, 10, 15).jd
    
  •  Date.valid_ordinal?(1582, 287, Date::ENGLAND).should_not == nil
    
  •  Date.valid_ordinal?(1582, 287, Date::ENGLAND).should == Date.civil(1582, 10, 14, Date::ENGLAND).jd
    
  • end
  • it "should be able to handle negative day numbers" do
  •  # October 1582
    
  •  #   S   M  Tu   W  Th   F   S
    
  •  #     -92 -91 -90 -89 -78 -77
    
  •  # -76 -75 -74 -73 -72 -71 -70
    
  •  # -69 -68 -67 -66 -65 -64 -63
    
  •  # -62
    
  •  Date.valid_ordinal?(1582, -89).should == Date.civil(1582, 10,  4).jd
    
  •  Date.valid_ordinal?(1582, -88).should == nil
    
  •  Date.valid_ordinal?(1582, -79).should == nil
    
  •  Date.valid_ordinal?(1582, -78).should == Date.civil(1582, 10, 15).jd
    
  •  Date.valid_ordinal?(2007, -100).should == Date.valid_ordinal?(2007, 266)
    
  • end
    end
  • it "should be able to handle negative day numbers" do
  • Date.valid_ordinal?(1582, -79).should == nil
  • Date.valid_ordinal?(2007, -100).should == Date.valid_ordinal?(2007, 266)
  • ruby_version_is "1.9" do
  • it "should be able to determine if the date is a valid ordinal date" do
  •  # October 1582
    
  •  #   S   M  Tu   W  Th   F   S
    
  •  #     274 275 276 277 278 279
    
  •  # 280 281 282 283 284 285 286
    
  •  # 287 288 289 290 291 292 293
    
  •  # 294
    
  •  Date.valid_ordinal?(1582, 277).should == true
    
  •  Date.valid_ordinal?(1582, 278).should == true
    
  •  Date.valid_ordinal?(1582, 287).should == true
    
  •  Date.valid_ordinal?(1582, 288).should == true
    
  • end
  • it "should be able to handle negative day numbers" do
  •  # October 1582
    
  •  #   S   M  Tu   W  Th   F   S
    
  •  #     -82 -81 -80 -79 -78 -77
    
  •  # -76 -75 -74 -73 -72 -71 -70
    
  •  # -69 -68 -67 -66 -65 -64 -63
    
  •  # -62
    
  •  Date.valid_ordinal?(1582, -79).should == true
    
  •  Date.valid_ordinal?(1582, -78).should == true
    
  •  Date.valid_ordinal?(2007, -100).should == true
    
  • end
    end

end

--
Yusuke ENDOH
=end

Actions #3

Updated by tadf (tadayoshi funaba) over 14 years ago

=begin

確認ですが、1.8 だと 1582-10-04 以前の commercial date は扱えない
(1581 年以前も含めて) ということでいいでしょうか。

というより、グレゴリオ暦でしかつかえないようにしていました。切り替えを
含む年でも、あくまでグレゴリオ暦で勘定した場合のみを考えるということで。

Date.commercial(2,1,1,Date::GREGORIAN).to_s #=> "0001-12-31"

1.9 では、実際の日数を基本に計算するので、そういうことはないです。

=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0