Project

General

Profile

Actions

Bug #10588

closed

Invalid Dates

Added by NorthernLights (Imran "") almost 10 years ago. Updated almost 10 years ago.

Status:
Rejected
Target version:
-
ruby -v:
2.0.0-p481
[ruby-core:66782]

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

SmartTime.rb (953 Bytes) SmartTime.rb NorthernLights (Imran ""), 01/07/2015 04:28 PM

Related issues 3 (0 open3 closed)

Related to Ruby master - Feature #9549: Improvements to Time::strptimeRejectedakr (Akira Tanaka)Actions
Related to Ruby master - Bug #10767: Time.local doesn't raise an exception during the dead hour on DSTRejectedakr (Akira Tanaka)01/21/2015Actions
Has duplicate Ruby master - Bug #10703: Invalid Dates Bug PatchRejected01/07/2015Actions

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

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

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
Actions #5

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)
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0