Bug #12297
closedRuby stdlib date can parse non-existent date with year 0
Description
Ruby date lib can parse date with year 0
$ pry [1] pry(main)> shitdate=Date.strptime('0000-01-07','%Y-%m-%d') => #<Date: 0000-01-07 ((1721064j,0s,0n),+0s,2299161j)> [2] pry(main)> shitdate.year => 0 [3] pry(main)>
There is no year 0 in gregorian and julian calendar between 1 BC and 1 AD
It should raise ArgumentError like it do when month/day number is 0.
Files
Updated by noahgibbs (Noah Gibbs) almost 10 years ago
- File no_year_0.patch no_year_0.patch added
Ruby has a lot of different time-parsing and date-parsing code. But for Date's strptime specifically, this is an easy fix. Patch is attached.
Updated by noahgibbs (Noah Gibbs) almost 10 years ago
Ah! It would be hard to "fix" Ruby's stdlib to not allow dates to have a 0 year in general, because of code like the Date test that can use a Date as a delta. That is:
class DateSub < Date; end
d2 = d - 1
assert_instance_of(DateSub, d2)
Things like DateSub can clearly have a 0 year, because that implies that the difference in years is 0, not that it's the year 0.
I think it still makes sense to fix strptime with the fix above. But I don't think Date or DateTime should disallow the year 0 in general.
Updated by matz (Yukihiro Matsumoto) over 9 years ago
According to [ruby-dev:10241] (Japanese), it's intentional.
In Gregorian calendar, the year 0 does not exist, but in astronomical year numbering, the year 0 does exist.
https://en.wikipedia.org/wiki/0_(year)
Matz.
Updated by jeremyevans0 (Jeremy Evans) over 6 years ago
- Status changed from Open to Rejected