Bug #10588
closedInvalid Dates
Description
I was in the process of implementing a date-routine, which could prevent possible out-of-range/invalid date values.
The interpreter, rightfully, threw an out-of range error, when I tried any of the following:
puts Time.mktime 2014, 13, 32
puts Time.mktime 2014, 13, 32
No surprises there. However, when I tried:
puts Time.mktime 2014, 11, 31
The interpreter, happily produced: 2014-12-01.
A little intrigued, I went ahead and tried the following routine:
1.upto(12){|month| puts Time.mktime 2014, month, 31}
Result:
2014-01-31 ok
2014-03-03 ???
2014-03-31 ok
2014-05-01 ???
2014-05-31 ok
2014-07-01 ???
2014-07-31 ok
2014-08-31 ok
2014-10-01 ???
2014-10-31 ok
2014-12-01 ???
2014-12-31 ok
I hope, I've been able to describe this issue adequately.
Thanks Matz & all the contributors for bringing this wonderful tool to us.
Regards.
Files
Updated by akr (Akira Tanaka) almost 10 years ago
- Status changed from Open to Rejected
It is not good idea to restrict current methods to reject invalid dates and times.
I tried to verify invalid time using round trip test once.
(ruby-core:14517, ruby-dev:33058, r14765, r15203)
But it caused bigger problems over benefits.
Invalid date/time is difficult to determine.
It is almost impossible by application because it depends various factors:
Month, leap year, summer time, leap seconds, time zone definition change.
Sometimes application needs a Time object near given year/month/day/hour/minute/second.
It is very difficult to do using the restricted methods.
So, methods only accept valid dates are less useful than current methods.
Updated by akr (Akira Tanaka) almost 10 years ago
- Related to Feature #9549: Improvements to Time::strptime added
Updated by akr (Akira Tanaka) almost 10 years ago
- Has duplicate Bug #10703: Invalid Dates Bug Patch added
Updated by NorthernLights (Imran "") almost 10 years ago
- File SmartTime.rb SmartTime.rb added
Patch to the above bug :
class SmartTime < Time
def self.mktime year, month, day
case month
when 4, 6, 9, 11
if day == 31
raise ArgumentError, 'argument out of range _ APR, JUNE, SEP, NOV', caller
else
super
end
when 2
case day
when 30, 31
raise ArgumentError, 'argument out of range _ FEB', caller
when 29
if year%100 == 0
if year%400 == 0
super
else
raise ArgumentError, 'argument out of range _ FEB', caller
end
else
if year%4 == 0
super
else
raise ArgumentError, 'argument out of range _ FEB', caller
end
end
else
super
end
else
super
end
end
end
Updated by akr (Akira Tanaka) almost 10 years ago
- Related to Bug #10767: Time.local doesn't raise an exception during the dead hour on DST added
Updated by akr (Akira Tanaka) almost 10 years ago
- Assignee set to akr (Akira Tanaka)