time package - parsing of incorrect data

Ashley Yakeley ashley at semantic.org
Mon May 25 19:02:04 EDT 2009


Paolo Losi wrote:
> Hi all,
> 
> I'm experimenting with time package parsing functionalities.
> I'm trying to verify what happens with inconsistent input data.
> 
>  From what I've seen, incorrect days are "truncated" while incorrect
> hours are left unmodified leading to inconsistent data.
> 
> Is this the intended behaviour? Would it be more appropriate
> to return a parsing Error (Nothing in the following example)?
> 
> with time-1.1.3:
> 
>  > parseTime defaultTimeLocale "%Y-%m-%d %H:%M" "2008-04-31 25:30" :: 
> Maybe LocalTime
> Just 2008-04-30 25:30:00

For instance:

 > parseTime defaultTimeLocale "%H:%M:%S" "25:74:99" :: Maybe TimeOfDay
Just 25:74:99

Currently the parsing code uses construction functions like this:

   fromGregorian :: Integer -> Int -> Int -> Day

   TimeOfDay :: Int -> Int -> Pico -> TimeOfDay -- just a constructor

Possibly it should use instead "validating constructors" that return a 
Maybe type. But note that some minutes have 61 seconds, and given that 
TimeOfDay might be local civil time (UTC + time zone offset), it can be 
any minute. So these must be allowed:

   23:59:60
   08:59:60
   04:29:60.999999999999
   12:17:60.683457690378

Just as UTC requires occasional minutes that have more than 60 seconds, 
there's a question of whether TimeOfDay might be used with timescales 
where minutes can have more than 61 seconds. I believe it would be of 
the order of millions of years before an extended UTC would need more 
than one leap second every minute.

So a validating "fromHourMinuteSecondValid" should check fields like this:

   0 <= hour < 24
   0 <= minute < 60
   0 <= second < 61

-- 
Ashley Yakeley


More information about the Libraries mailing list