packages feed

time 1.7.0.1 → 1.8

raw patch · 94 files changed

+5644/−5032 lines, 94 filesdep +tastydep +tasty-hunitdep +tasty-quickcheckdep −test-frameworkdep −test-framework-quickcheck2dep ~QuickCheckdep ~basedep ~deepseq

Dependencies added: tasty, tasty-hunit, tasty-quickcheck

Dependencies removed: test-framework, test-framework-quickcheck2

Dependency ranges changed: QuickCheck, base, deepseq

Files

changelog.md view
@@ -1,5 +1,12 @@ # Change Log +## [1.8]+- Added SystemTime+- Data.Time.Format: allow padding widths in specifiers for formatting (but not parsing)+- Test: use tasty, general clean-up+- Test: separate out UNIX-specific tests, so the others can be run on Windows+- Clean up haddock.+ ## [1.7.0.1] - Fix bounds issue in .cabal file 
configure.ac view
@@ -1,4 +1,4 @@-AC_INIT([Haskell time package], [1.7.0.1], [ashley@semantic.org], [time])+AC_INIT([Haskell time package], [1.8], [ashley@semantic.org], [time])  # Safety check: Ensure that we are in the correct source directory. AC_CONFIG_SRCDIR([lib/include/HsTime.h])
lib/Data/Time/Calendar/Gregorian.hs view
@@ -20,27 +20,27 @@ import Data.Time.Calendar.Days import Data.Time.Calendar.Private --- | convert to proleptic Gregorian calendar. First element of result is year, second month number (1-12), third day (1-31).+-- | Convert to proleptic Gregorian calendar. First element of result is year, second month number (1-12), third day (1-31). toGregorian :: Day -> (Integer,Int,Int) toGregorian date = (year,month,day) where     (year,yd) = toOrdinalDate date     (month,day) = dayOfYearToMonthAndDay (isLeapYear year) yd --- | convert from proleptic Gregorian calendar. First argument is year, second month number (1-12), third day (1-31).+-- | Convert from proleptic Gregorian calendar. First argument is year, second month number (1-12), third day (1-31). -- Invalid values will be clipped to the correct range, month first, then day. fromGregorian :: Integer -> Int -> Int -> Day fromGregorian year month day = fromOrdinalDate year (monthAndDayToDayOfYear (isLeapYear year) month day) --- | convert from proleptic Gregorian calendar. First argument is year, second month number (1-12), third day (1-31).+-- | Convert from proleptic Gregorian calendar. First argument is year, second month number (1-12), third day (1-31). -- Invalid values will return Nothing fromGregorianValid :: Integer -> Int -> Int -> Maybe Day fromGregorianValid year month day = do     doy <- monthAndDayToDayOfYearValid (isLeapYear year) month day     fromOrdinalDateValid year doy --- | show in ISO 8601 format (yyyy-mm-dd)+-- | Show in ISO 8601 format (yyyy-mm-dd) showGregorian :: Day -> String-showGregorian date = (show4 (Just '0') y) ++ "-" ++ (show2 (Just '0') m) ++ "-" ++ (show2 (Just '0') d) where+showGregorian date = (show4 y) ++ "-" ++ (show2 m) ++ "-" ++ (show2 d) where     (y,m,d) = toGregorian date  -- | The number of days in a given month according to the proleptic Gregorian calendar. First argument is year, second is month.
lib/Data/Time/Calendar/Julian.hs view
@@ -15,27 +15,27 @@ import Data.Time.Calendar.Days import Data.Time.Calendar.Private --- | convert to proleptic Julian calendar. First element of result is year, second month number (1-12), third day (1-31).+-- | Convert to proleptic Julian calendar. First element of result is year, second month number (1-12), third day (1-31). toJulian :: Day -> (Integer,Int,Int) toJulian date = (year,month,day) where     (year,yd) = toJulianYearAndDay date     (month,day) = dayOfYearToMonthAndDay (isJulianLeapYear year) yd --- | convert from proleptic Julian calendar. First argument is year, second month number (1-12), third day (1-31).+-- | Convert from proleptic Julian calendar. First argument is year, second month number (1-12), third day (1-31). -- Invalid values will be clipped to the correct range, month first, then day. fromJulian :: Integer -> Int -> Int -> Day fromJulian year month day = fromJulianYearAndDay year (monthAndDayToDayOfYear (isJulianLeapYear year) month day) --- | convert from proleptic Julian calendar. First argument is year, second month number (1-12), third day (1-31).+-- | Convert from proleptic Julian calendar. First argument is year, second month number (1-12), third day (1-31). -- Invalid values will return Nothing. fromJulianValid :: Integer -> Int -> Int -> Maybe Day fromJulianValid year month day = do     doy <- monthAndDayToDayOfYearValid (isJulianLeapYear year) month day     fromJulianYearAndDayValid year doy --- | show in ISO 8601 format (yyyy-mm-dd)+-- | Show in ISO 8601 format (yyyy-mm-dd) showJulian :: Day -> String-showJulian date = (show4 (Just '0') y) ++ "-" ++ (show2 (Just '0') m) ++ "-" ++ (show2 (Just '0') d) where+showJulian date = (show4 y) ++ "-" ++ (show2 m) ++ "-" ++ (show2 d) where     (y,m,d) = toJulian date  -- | The number of days in a given month according to the proleptic Julian calendar. First argument is year, second is month.
lib/Data/Time/Calendar/JulianYearDay.hs view
@@ -8,7 +8,7 @@ import Data.Time.Calendar.Days import Data.Time.Calendar.Private --- | convert to proleptic Julian year and day format. First element of result is year (proleptic Julian calendar),+-- | Convert to proleptic Julian year and day format. First element of result is year (proleptic Julian calendar), -- second is the day of the year, with 1 for Jan 1, and 365 (or 366 in leap years) for Dec 31. toJulianYearAndDay :: Day -> (Integer,Int) toJulianYearAndDay (ModifiedJulianDay mjd) = (year,yd) where@@ -19,14 +19,14 @@     yd = fromInteger (d - (y * 365) + 1)     year = quad * 4 + y + 1 --- | convert from proleptic Julian year and day format.+-- | Convert from proleptic Julian year and day format. -- Invalid day numbers will be clipped to the correct range (1 to 365 or 366). fromJulianYearAndDay :: Integer -> Int -> Day fromJulianYearAndDay year day = ModifiedJulianDay mjd where     y = year - 1     mjd = (fromIntegral (clip 1 (if isJulianLeapYear year then 366 else 365) day)) + (365 * y) + (div y 4) - 678578 --- | convert from proleptic Julian year and day format.+-- | Convert from proleptic Julian year and day format. -- Invalid day numbers will return Nothing fromJulianYearAndDayValid :: Integer -> Int -> Maybe Day fromJulianYearAndDayValid year day = do@@ -36,9 +36,9 @@         mjd = (fromIntegral day') + (365 * y) + (div y 4) - 678578     return (ModifiedJulianDay mjd) --- | show in proleptic Julian year and day format (yyyy-ddd)+-- | Show in proleptic Julian year and day format (yyyy-ddd) showJulianYearAndDay :: Day -> String-showJulianYearAndDay date = (show4 (Just '0') y) ++ "-" ++ (show3 (Just '0') d) where+showJulianYearAndDay date = (show4 y) ++ "-" ++ (show3 d) where     (y,d) = toJulianYearAndDay date  -- | Is this year a leap year according to the proleptic Julian calendar?
lib/Data/Time/Calendar/MonthDay.hs view
@@ -5,8 +5,8 @@  import Data.Time.Calendar.Private --- | convert month and day in the Gregorian or Julian calendars to day of year.--- First arg is leap year flag+-- | Convert month and day in the Gregorian or Julian calendars to day of year.+-- First arg is leap year flag. monthAndDayToDayOfYear :: Bool -> Int -> Int -> Int monthAndDayToDayOfYear isLeap month day = (div (367 * month'' - 362) 12) + k + day' where     month' = clip 1 12 month@@ -14,8 +14,8 @@     month'' = fromIntegral month'     k = if month' <= 2 then 0 else if isLeap then -1 else -2 --- | convert month and day in the Gregorian or Julian calendars to day of year.--- First arg is leap year flag+-- | Convert month and day in the Gregorian or Julian calendars to day of year.+-- First arg is leap year flag. monthAndDayToDayOfYearValid :: Bool -> Int -> Int -> Maybe Int monthAndDayToDayOfYearValid isLeap month day = do     month' <- clipValid 1 12 month@@ -26,8 +26,8 @@         k = if month' <= 2 then 0 else if isLeap then -1 else -2     return ((div (367 * month'' - 362) 12) + k + day'') --- | convert day of year in the Gregorian or Julian calendars to month and day.--- First arg is leap year flag+-- | Convert day of year in the Gregorian or Julian calendars to month and day.+-- First arg is leap year flag. dayOfYearToMonthAndDay :: Bool -> Int -> (Int,Int) dayOfYearToMonthAndDay isLeap yd = findMonthDay (monthLengths isLeap) (clip 1 (if isLeap then 366 else 365) yd) @@ -35,8 +35,8 @@ findMonthDay (n:ns) yd | yd > n = (\(m,d) -> (m + 1,d)) (findMonthDay ns (yd - n)) findMonthDay _ yd = (1,yd) --- | the length of a given month in the Gregorian or Julian calendars.--- First arg is leap year flag+-- | The length of a given month in the Gregorian or Julian calendars.+-- First arg is leap year flag. monthLength :: Bool -> Int -> Int monthLength isLeap month' = monthLength' isLeap (clip 1 12 month') 
lib/Data/Time/Calendar/OrdinalDate.hs view
@@ -4,7 +4,7 @@ import Data.Time.Calendar.Days import Data.Time.Calendar.Private --- | convert to ISO 8601 Ordinal Date format. First element of result is year (proleptic Gregoran calendar),+-- | Convert to ISO 8601 Ordinal Date format. First element of result is year (proleptic Gregoran calendar), -- second is the day of the year, with 1 for Jan 1, and 365 (or 366 in leap years) for Dec 31. toOrdinalDate :: Day -> (Integer,Int) toOrdinalDate (ModifiedJulianDay mjd) = (year,yd) where@@ -19,15 +19,15 @@     yd = fromInteger (d - (y * 365) + 1)     year = quadcent * 400 + cent * 100 + quad * 4 + y + 1 --- | convert from ISO 8601 Ordinal Date format.+-- | Convert from ISO 8601 Ordinal Date format. -- Invalid day numbers will be clipped to the correct range (1 to 365 or 366). fromOrdinalDate :: Integer -> Int -> Day fromOrdinalDate year day = ModifiedJulianDay mjd where     y = year - 1     mjd = (fromIntegral (clip 1 (if isLeapYear year then 366 else 365) day)) + (365 * y) + (div y 4) - (div y 100) + (div y 400) - 678576 --- | convert from ISO 8601 Ordinal Date format.--- Invalid day numbers return Nothing+-- | Convert from ISO 8601 Ordinal Date format.+-- Invalid day numbers return 'Nothing' fromOrdinalDateValid :: Integer -> Int -> Maybe Day fromOrdinalDateValid year day = do     day' <- clipValid 1 (if isLeapYear year then 366 else 365) day@@ -36,9 +36,9 @@         mjd = (fromIntegral day') + (365 * y) + (div y 4) - (div y 100) + (div y 400) - 678576     return (ModifiedJulianDay mjd) --- | show in ISO 8601 Ordinal Date format (yyyy-ddd)+-- | Show in ISO 8601 Ordinal Date format (yyyy-ddd) showOrdinalDate :: Day -> String-showOrdinalDate date = (show4 (Just '0') y) ++ "-" ++ (show3 (Just '0') d) where+showOrdinalDate date = (show4 y) ++ "-" ++ (show3 d) where     (y,d) = toOrdinalDate date  -- | Is this year a leap year according to the proleptic Gregorian calendar?@@ -46,8 +46,8 @@ isLeapYear year = (mod year 4 == 0) && ((mod year 400 == 0) || not (mod year 100 == 0))  -- | Get the number of the Monday-starting week in the year and the day of the week.--- The first Monday is the first day of week 1, any earlier days in the year are week 0 (as \"%W\" in 'Data.Time.Format.formatTime').--- Monday is 1, Sunday is 7 (as \"%u\" in 'Data.Time.Format.formatTime').+-- The first Monday is the first day of week 1, any earlier days in the year are week 0 (as @%W@ in 'Data.Time.Format.formatTime').+-- Monday is 1, Sunday is 7 (as @%u@ in 'Data.Time.Format.formatTime'). mondayStartWeek :: Day -> (Int,Int) mondayStartWeek date = (fromInteger ((div d 7) - (div k 7)),fromInteger (mod d 7) + 1) where     yd = snd (toOrdinalDate date)@@ -55,8 +55,8 @@     k = d - (toInteger yd)  -- | Get the number of the Sunday-starting week in the year and the day of the week.--- The first Sunday is the first day of week 1, any earlier days in the year are week 0 (as \"%U\" in 'Data.Time.Format.formatTime').--- Sunday is 0, Saturday is 6 (as \"%w\" in 'Data.Time.Format.formatTime').+-- The first Sunday is the first day of week 1, any earlier days in the year are week 0 (as @%U@ in 'Data.Time.Format.formatTime').+-- Sunday is 0, Saturday is 6 (as @%w@ in 'Data.Time.Format.formatTime'). sundayStartWeek :: Day -> (Int,Int) sundayStartWeek date =(fromInteger ((div d 7) - (div k 7)),fromInteger (mod d 7)) where     yd = snd (toOrdinalDate date)@@ -66,11 +66,11 @@ -- | The inverse of 'mondayStartWeek'. Get a 'Day' given the year, -- the number of the Monday-starting week, and the day of the week. -- The first Monday is the first day of week 1, any earlier days in the year--- are week 0 (as \"%W\" in 'Data.Time.Format.formatTime').+-- are week 0 (as @%W@ in 'Data.Time.Format.formatTime'). fromMondayStartWeek :: Integer -- ^ Year.-                    -> Int     -- ^ Monday-starting week number (as \"%W\" in 'Data.Time.Format.formatTime').+                    -> Int     -- ^ Monday-starting week number (as @%W@ in 'Data.Time.Format.formatTime').                     -> Int     -- ^ Day of week.-                               -- Monday is 1, Sunday is 7 (as \"%u\" in 'Data.Time.Format.formatTime').+                               -- Monday is 1, Sunday is 7 (as @%u@ in 'Data.Time.Format.formatTime').                     -> Day fromMondayStartWeek year w d = let     -- first day of the year@@ -91,9 +91,9 @@     in addDays zbYearDay firstDay  fromMondayStartWeekValid :: Integer -- ^ Year.-                    -> Int     -- ^ Monday-starting week number (as \"%W\" in 'Data.Time.Format.formatTime').+                    -> Int     -- ^ Monday-starting week number (as @%W@ in 'Data.Time.Format.formatTime').                     -> Int     -- ^ Day of week.-                               -- Monday is 1, Sunday is 7 (as \"%u\" in 'Data.Time.Format.formatTime').+                               -- Monday is 1, Sunday is 7 (as @%u@ in 'Data.Time.Format.formatTime').                     -> Maybe Day fromMondayStartWeekValid year w d = do     d' <- clipValid 1 7 d@@ -119,11 +119,11 @@ -- | The inverse of 'sundayStartWeek'. Get a 'Day' given the year and -- the number of the day of a Sunday-starting week. -- The first Sunday is the first day of week 1, any earlier days in the--- year are week 0 (as \"%U\" in 'Data.Time.Format.formatTime').+-- year are week 0 (as @%U@ in 'Data.Time.Format.formatTime'). fromSundayStartWeek :: Integer -- ^ Year.-                    -> Int     -- ^ Sunday-starting week number (as \"%U\" in 'Data.Time.Format.formatTime').+                    -> Int     -- ^ Sunday-starting week number (as @%U@ in 'Data.Time.Format.formatTime').                     -> Int     -- ^ Day of week-                               -- Sunday is 0, Saturday is 6 (as \"%w\" in 'Data.Time.Format.formatTime').+                               -- Sunday is 0, Saturday is 6 (as @%w@ in 'Data.Time.Format.formatTime').                     -> Day fromSundayStartWeek year w d = let     -- first day of the year@@ -144,9 +144,9 @@     in addDays zbYearDay firstDay  fromSundayStartWeekValid :: Integer -- ^ Year.-                    -> Int     -- ^ Sunday-starting week number (as \"%U\" in 'Data.Time.Format.formatTime').+                    -> Int     -- ^ Sunday-starting week number (as @%U@ in 'Data.Time.Format.formatTime').                     -> Int     -- ^ Day of week.-                               -- Sunday is 0, Saturday is 6 (as \"%w\" in 'Data.Time.Format.formatTime').+                               -- Sunday is 0, Saturday is 6 (as @%w@ in 'Data.Time.Format.formatTime').                     -> Maybe Day fromSundayStartWeekValid year w d =  do     d' <- clipValid 0 6 d
lib/Data/Time/Calendar/Private.hs view
@@ -3,35 +3,29 @@  import Data.Fixed -type NumericPadOption = Maybe Char--pad1 :: NumericPadOption -> String -> String-pad1 (Just c) s = c:s-pad1 _ s = s+data PadOption = Pad Int Char | NoPad -padN :: Int -> Char -> String -> String-padN i _ s | i <= 0 = s-padN i c s = (replicate i c) ++ s+showPadded :: PadOption -> String -> String+showPadded NoPad s = s+showPadded (Pad i c) s = replicate (i - length s) c ++ s -show2Fixed :: NumericPadOption -> Pico -> String-show2Fixed opt x | x < 10 = pad1 opt (showFixed True x)-show2Fixed _ x = showFixed True x+showPaddedNum :: (Num t,Ord t,Show t) => PadOption -> t -> String+showPaddedNum NoPad i = show i+showPaddedNum pad i | i < 0 = '-':(showPaddedNum pad (negate i))+showPaddedNum pad i = showPadded pad $ show i -showPaddedMin :: (Num t,Ord t,Show t) => Int -> NumericPadOption -> t -> String-showPaddedMin _ Nothing i = show i-showPaddedMin pl opt i | i < 0 = '-':(showPaddedMin pl opt (negate i))-showPaddedMin pl (Just c) i =-  let s = show i in-    padN (pl - (length s)) c s+show2Fixed :: Pico -> String+show2Fixed x | x < 10 = '0':(showFixed True x)+show2Fixed x = showFixed True x -show2 :: (Num t,Ord t,Show t) => NumericPadOption -> t -> String-show2 = showPaddedMin 2+show2 :: (Num t,Ord t,Show t) => t -> String+show2 = showPaddedNum $ Pad 2 '0' -show3 :: (Num t,Ord t,Show t) => NumericPadOption -> t -> String-show3 = showPaddedMin 3+show3 :: (Num t,Ord t,Show t) => t -> String+show3 = showPaddedNum $ Pad 3 '0' -show4 :: (Num t,Ord t,Show t) => NumericPadOption -> t -> String-show4 = showPaddedMin 4+show4 :: (Num t,Ord t,Show t) => t -> String+show4 = showPaddedNum $ Pad 4 '0'  mod100 :: (Integral i) => i -> i mod100 x = mod x 100
lib/Data/Time/Calendar/WeekDate.hs view
@@ -5,7 +5,7 @@ import Data.Time.Calendar.Days import Data.Time.Calendar.Private --- | convert to ISO 8601 Week Date format. First element of result is year, second week number (1-53), third day of week (1 for Monday to 7 for Sunday).+-- | Convert to ISO 8601 Week Date format. First element of result is year, second week number (1-53), third day of week (1 for Monday to 7 for Sunday). -- Note that \"Week\" years are not quite the same as Gregorian years, as the first day of the year is always a Monday. -- The first week of a year is the first week to contain at least four days in the corresponding Gregorian year. toWeekDate :: Day -> (Integer,Int,Int)@@ -23,7 +23,7 @@                       else (y0, 52)                 w0  -> (y0, w0) --- | convert from ISO 8601 Week Date format. First argument is year, second week number (1-52 or 53), third day of week (1 for Monday to 7 for Sunday).+-- | Convert from ISO 8601 Week Date format. First argument is year, second week number (1-52 or 53), third day of week (1 for Monday to 7 for Sunday). -- Invalid week and day values will be clipped to the correct range. fromWeekDate :: Integer -> Int -> Int -> Day fromWeekDate y w d = ModifiedJulianDay (k - (mod k 7) + (toInteger (((clip 1 (if longYear then 53 else 52) w) * 7) + (clip 1 7 d))) - 10) where@@ -32,7 +32,7 @@             (_,53,_) -> True             _ -> False --- | convert from ISO 8601 Week Date format. First argument is year, second week number (1-52 or 53), third day of week (1 for Monday to 7 for Sunday).+-- | Convert from ISO 8601 Week Date format. First argument is year, second week number (1-52 or 53), third day of week (1 for Monday to 7 for Sunday). -- Invalid week and day values will return Nothing. fromWeekDateValid :: Integer -> Int -> Int -> Maybe Day fromWeekDateValid y w d = do@@ -46,7 +46,7 @@         k = toModifiedJulianDay (fromOrdinalDate y 6)     return (ModifiedJulianDay (k - (mod k 7) + (toInteger ((w' * 7) + d')) - 10)) --- | show in ISO 8601 Week Date format as yyyy-Www-d (e.g. \"2006-W46-3\").+-- | Show in ISO 8601 Week Date format as yyyy-Www-d (e.g. \"2006-W46-3\"). showWeekDate :: Day -> String-showWeekDate date = (show4 (Just '0') y) ++ "-W" ++ (show2 (Just '0') w) ++ "-" ++ (show d) where+showWeekDate date = (show4 y) ++ "-W" ++ (show2 w) ++ "-" ++ (show d) where     (y,w,d) = toWeekDate date
lib/Data/Time/Clock.hs view
@@ -1,15 +1,21 @@ -- | Types and functions for UTC and UT1 module Data.Time.Clock (-    module Data.Time.Clock.Scale,-    module Data.Time.Clock.UTC,-    module Data.Time.Clock.UTCDiff,-    getCurrentTime+    module Data.Time.Clock.Internal.UniversalTime,+    module Data.Time.Clock.Internal.DiffTime,+    module Data.Time.Clock.Internal.UTCTime,+    module Data.Time.Clock.Internal.NominalDiffTime,+    module Data.Time.Clock.Internal.UTCDiff,+    getCurrentTime,+    getTime_resolution ) where -import Data.Time.Clock.Scale-import Data.Time.Clock.UTCDiff-import Data.Time.Clock.UTC+import Data.Time.Clock.Internal.UniversalTime+import Data.Time.Clock.Internal.DiffTime+import Data.Time.Clock.Internal.SystemTime+import Data.Time.Clock.Internal.UTCDiff+import Data.Time.Clock.Internal.NominalDiffTime+import Data.Time.Clock.Internal.UTCTime import Data.Time.Clock.POSIX import Data.Time.Format.Parse() import Data.Time.LocalTime()
− lib/Data/Time/Clock/CTimespec.hsc
@@ -1,41 +0,0 @@--- #hide-module Data.Time.Clock.CTimespec where--#include "HsTimeConfig.h"--#if !defined(mingw32_HOST_OS) && HAVE_CLOCK_GETTIME--#if __GLASGOW_HASKELL__ >= 709-import Foreign-#else-import Foreign.Safe-#endif-import Foreign.C--#include <time.h>--data CTimespec = MkCTimespec CTime CLong--instance Storable CTimespec where-    sizeOf _ = #{size struct timespec}-    alignment _ = alignment (undefined :: CLong)-    peek p = do-        s  <- #{peek struct timespec, tv_sec } p-        ns <- #{peek struct timespec, tv_nsec} p-        return (MkCTimespec s ns)-    poke p (MkCTimespec s ns) = do-        #{poke struct timespec, tv_sec } p s-        #{poke struct timespec, tv_nsec} p ns--foreign import ccall unsafe "time.h clock_gettime"-    clock_gettime :: #{type clockid_t} -> Ptr CTimespec -> IO CInt---- | Get the current POSIX time from the system clock.-getCTimespec :: IO CTimespec-getCTimespec = alloca (\ptspec -> do-    throwErrnoIfMinus1_ "clock_gettime" $-        clock_gettime #{const CLOCK_REALTIME} ptspec-    peek ptspec-    )--#endif
− lib/Data/Time/Clock/CTimeval.hs
@@ -1,36 +0,0 @@--- #hide-module Data.Time.Clock.CTimeval where--#ifndef mingw32_HOST_OS--- All Unix-specific, this--#if __GLASGOW_HASKELL__ >= 709 || __GLASGOW_HASKELL__ < 702-import Foreign-#else-import Foreign.Safe-#endif-import Foreign.C--data CTimeval = MkCTimeval CLong CLong--instance Storable CTimeval where-    sizeOf _ = (sizeOf (undefined :: CLong)) * 2-    alignment _ = alignment (undefined :: CLong)-    peek p = do-        s   <- peekElemOff (castPtr p) 0-        mus <- peekElemOff (castPtr p) 1-        return (MkCTimeval s mus)-    poke p (MkCTimeval s mus) = do-        pokeElemOff (castPtr p) 0 s-        pokeElemOff (castPtr p) 1 mus--foreign import ccall unsafe "time.h gettimeofday" gettimeofday :: Ptr CTimeval -> Ptr () -> IO CInt---- | Get the current POSIX time from the system clock.-getCTimeval :: IO CTimeval-getCTimeval = with (MkCTimeval 0 0) (\ptval -> do-    throwErrnoIfMinus1_ "gettimeofday" $ gettimeofday ptval nullPtr-    peek ptval-    )--#endif
+ lib/Data/Time/Clock/Internal/AbsoluteTime.hs view
@@ -0,0 +1,47 @@+-- {-# OPTIONS -fno-warn-unused-imports #-}+#include "HsConfigure.h"+-- | TAI and leap-second maps for converting to UTC: most people won't need this module.+module Data.Time.Clock.Internal.AbsoluteTime+(+    -- TAI arithmetic+    AbsoluteTime,taiEpoch,addAbsoluteTime,diffAbsoluteTime,+    taiNominalDayStart,+) where++import Data.Typeable+#if LANGUAGE_Rank2Types+import Data.Data+#endif+import Control.DeepSeq+import Data.Time.Calendar.Days+import Data.Time.Clock.Internal.DiffTime+++-- | AbsoluteTime is TAI, time as measured by a clock.+newtype AbsoluteTime = MkAbsoluteTime DiffTime deriving (Eq,Ord+#if LANGUAGE_DeriveDataTypeable+#if LANGUAGE_Rank2Types+#if HAS_DataPico+    ,Data, Typeable+#endif+#endif+#endif+    )++instance NFData AbsoluteTime where+    rnf (MkAbsoluteTime a) = rnf a++-- | The epoch of TAI, which is 1858-11-17 00:00:00 TAI.+taiEpoch :: AbsoluteTime+taiEpoch = MkAbsoluteTime 0++taiNominalDayStart :: Day -> AbsoluteTime+taiNominalDayStart day = MkAbsoluteTime $ realToFrac $ (toModifiedJulianDay day) * 86400++-- | addAbsoluteTime a b = a + b+addAbsoluteTime :: DiffTime -> AbsoluteTime -> AbsoluteTime+addAbsoluteTime t (MkAbsoluteTime a) = MkAbsoluteTime (a + t)++-- | diffAbsoluteTime a b = a - b+diffAbsoluteTime :: AbsoluteTime -> AbsoluteTime -> DiffTime+diffAbsoluteTime (MkAbsoluteTime a) (MkAbsoluteTime b) = a - b
+ lib/Data/Time/Clock/Internal/CTimespec.hsc view
@@ -0,0 +1,76 @@+module Data.Time.Clock.Internal.CTimespec where++#include "HsTimeConfig.h"++#if !defined(mingw32_HOST_OS) && HAVE_CLOCK_GETTIME++#if __GLASGOW_HASKELL__ >= 709+import Foreign+#else+import Foreign.Safe+#endif+import Foreign.C+import System.IO.Unsafe++#include <time.h>++type ClockID = #{type clockid_t}++data CTimespec = MkCTimespec CTime CLong++instance Storable CTimespec where+    sizeOf _ = #{size struct timespec}+    alignment _ = alignment (undefined :: CLong)+    peek p = do+        s  <- #{peek struct timespec, tv_sec } p+        ns <- #{peek struct timespec, tv_nsec} p+        return (MkCTimespec s ns)+    poke p (MkCTimespec s ns) = do+        #{poke struct timespec, tv_sec } p s+        #{poke struct timespec, tv_nsec} p ns++foreign import ccall unsafe "time.h clock_gettime"+    clock_gettime :: ClockID -> Ptr CTimespec -> IO CInt+foreign import ccall unsafe "time.h clock_getres"+    clock_getres :: ClockID -> Ptr CTimespec -> IO CInt++-- | Get the resolution of the given clock.+clockGetRes :: #{type clockid_t} -> IO (Either Errno CTimespec)+clockGetRes clockid = alloca $ \ptspec -> do+    rc <- clock_getres clockid ptspec+    case rc of+        0 -> do+            res <- peek ptspec+            return $ Right res+        _ -> do+            errno <- getErrno+            return $ Left errno++-- | Get the current time from the given clock.+clockGetTime :: ClockID -> IO CTimespec+clockGetTime clockid = alloca (\ptspec -> do+    throwErrnoIfMinus1_ "clock_gettime" $ clock_gettime clockid ptspec+    peek ptspec+    )++clock_REALTIME :: ClockID+clock_REALTIME = #{const CLOCK_REALTIME}++clock_TAI :: ClockID+clock_TAI = #{const 11}++realtimeRes :: CTimespec+realtimeRes = unsafePerformIO $ do+    mres <- clockGetRes clock_REALTIME+    case mres of+        Left errno -> ioError (errnoToIOError "clock_getres" errno Nothing Nothing)+        Right res -> return res++clockResolution :: ClockID -> Maybe CTimespec+clockResolution clockid = unsafePerformIO $ do+    mres <- clockGetRes clockid+    case mres of+        Left _ -> return Nothing+        Right res -> return $ Just res++#endif
+ lib/Data/Time/Clock/Internal/CTimeval.hs view
@@ -0,0 +1,35 @@+module Data.Time.Clock.Internal.CTimeval where++#ifndef mingw32_HOST_OS+-- All Unix-specific, this++#if __GLASGOW_HASKELL__ >= 709 || __GLASGOW_HASKELL__ < 702+import Foreign+#else+import Foreign.Safe+#endif+import Foreign.C++data CTimeval = MkCTimeval CLong CLong++instance Storable CTimeval where+    sizeOf _ = (sizeOf (undefined :: CLong)) * 2+    alignment _ = alignment (undefined :: CLong)+    peek p = do+        s   <- peekElemOff (castPtr p) 0+        mus <- peekElemOff (castPtr p) 1+        return (MkCTimeval s mus)+    poke p (MkCTimeval s mus) = do+        pokeElemOff (castPtr p) 0 s+        pokeElemOff (castPtr p) 1 mus++foreign import ccall unsafe "time.h gettimeofday" gettimeofday :: Ptr CTimeval -> Ptr () -> IO CInt++-- | Get the current POSIX time from the system clock.+getCTimeval :: IO CTimeval+getCTimeval = with (MkCTimeval 0 0) (\ptval -> do+    throwErrnoIfMinus1_ "gettimeofday" $ gettimeofday ptval nullPtr+    peek ptval+    )++#endif
+ lib/Data/Time/Clock/Internal/DiffTime.hs view
@@ -0,0 +1,100 @@+#if __GLASGOW_HASKELL__ >= 702+{-# LANGUAGE Trustworthy #-}+#endif+{-# OPTIONS -fno-warn-unused-imports #-}+#include "HsConfigure.h"+-- #hide+module Data.Time.Clock.Internal.DiffTime+    (+    -- * Absolute intervals+    DiffTime,+    secondsToDiffTime,+    picosecondsToDiffTime,+    diffTimeToPicoseconds,+    ) where++import Data.Typeable+#if LANGUAGE_Rank2Types+import Data.Data+#endif+import Data.Ratio ((%))+import Data.Fixed+import Control.DeepSeq+++-- | This is a length of time, as measured by a clock.+-- Conversion functions will treat it as seconds.+-- It has a precision of 10^-12 s.+newtype DiffTime = MkDiffTime Pico deriving (Eq,Ord+#if LANGUAGE_DeriveDataTypeable+#if LANGUAGE_Rank2Types+#if HAS_DataPico+    ,Data, Typeable+#else+#endif+#endif+#endif+    )++-- necessary because H98 doesn't have "cunning newtype" derivation+instance NFData DiffTime where -- FIXME: Data.Fixed had no NFData instances yet at time of writing+        rnf dt = seq dt ()++-- necessary because H98 doesn't have "cunning newtype" derivation+instance Enum DiffTime where+    succ (MkDiffTime a) = MkDiffTime (succ a)+    pred (MkDiffTime a) = MkDiffTime (pred a)+    toEnum = MkDiffTime . toEnum+    fromEnum (MkDiffTime a) = fromEnum a+    enumFrom (MkDiffTime a) = fmap MkDiffTime (enumFrom a)+    enumFromThen (MkDiffTime a) (MkDiffTime b) = fmap MkDiffTime (enumFromThen a b)+    enumFromTo (MkDiffTime a) (MkDiffTime b) = fmap MkDiffTime (enumFromTo a b)+    enumFromThenTo (MkDiffTime a) (MkDiffTime b) (MkDiffTime c) = fmap MkDiffTime (enumFromThenTo a b c)++instance Show DiffTime where+    show (MkDiffTime t) = (showFixed True t) ++ "s"++-- necessary because H98 doesn't have "cunning newtype" derivation+instance Num DiffTime where+    (MkDiffTime a) + (MkDiffTime b) = MkDiffTime (a + b)+    (MkDiffTime a) - (MkDiffTime b) = MkDiffTime (a - b)+    (MkDiffTime a) * (MkDiffTime b) = MkDiffTime (a * b)+    negate (MkDiffTime a) = MkDiffTime (negate a)+    abs (MkDiffTime a) = MkDiffTime (abs a)+    signum (MkDiffTime a) = MkDiffTime (signum a)+    fromInteger i = MkDiffTime (fromInteger i)++-- necessary because H98 doesn't have "cunning newtype" derivation+instance Real DiffTime where+    toRational (MkDiffTime a) = toRational a++-- necessary because H98 doesn't have "cunning newtype" derivation+instance Fractional DiffTime where+    (MkDiffTime a) / (MkDiffTime b) = MkDiffTime (a / b)+    recip (MkDiffTime a) = MkDiffTime (recip a)+    fromRational r = MkDiffTime (fromRational r)++-- necessary because H98 doesn't have "cunning newtype" derivation+instance RealFrac DiffTime where+    properFraction (MkDiffTime a) = let (b',a') = properFraction a in (b',MkDiffTime a')+    truncate (MkDiffTime a) = truncate a+    round (MkDiffTime a) = round a+    ceiling (MkDiffTime a) = ceiling a+    floor (MkDiffTime a) = floor a++-- | Create a 'DiffTime' which represents an integral number of seconds.+secondsToDiffTime :: Integer -> DiffTime+secondsToDiffTime = fromInteger++-- | Create a 'DiffTime' from a number of picoseconds.+picosecondsToDiffTime :: Integer -> DiffTime+picosecondsToDiffTime x = MkDiffTime (MkFixed x)++-- | Get the number of picoseconds in a 'DiffTime'.+diffTimeToPicoseconds :: DiffTime -> Integer+diffTimeToPicoseconds (MkDiffTime (MkFixed x)) = x++{-# RULES+"realToFrac/DiffTime->Pico"              realToFrac = \ (MkDiffTime ps) -> ps+"realToFrac/Pico->DiffTime"              realToFrac = MkDiffTime+  #-}
+ lib/Data/Time/Clock/Internal/NominalDiffTime.hs view
@@ -0,0 +1,94 @@+{-# OPTIONS -fno-warn-unused-imports #-}+#if __GLASGOW_HASKELL__ >= 702+{-# LANGUAGE Trustworthy #-}+#endif+#include "HsConfigure.h"+-- #hide+module Data.Time.Clock.Internal.NominalDiffTime+    (+    NominalDiffTime,+    nominalDay,+    ) where++import Data.Typeable+#if LANGUAGE_Rank2Types+import Data.Data+#endif+import Data.Fixed+import Data.Time.Calendar.Days+import Control.DeepSeq+++-- | This is a length of time, as measured by UTC.+-- Conversion functions will treat it as seconds.+-- It has a precision of 10^-12 s.+-- It ignores leap-seconds, so it's not necessarily a fixed amount of clock time.+-- For instance, 23:00 UTC + 2 hours of NominalDiffTime = 01:00 UTC (+ 1 day),+-- regardless of whether a leap-second intervened.+newtype NominalDiffTime = MkNominalDiffTime Pico deriving (Eq,Ord+#if LANGUAGE_DeriveDataTypeable+#if LANGUAGE_Rank2Types+#if HAS_DataPico+    ,Data, Typeable+#endif+#endif+#endif+    )++-- necessary because H98 doesn't have "cunning newtype" derivation+instance NFData NominalDiffTime where -- FIXME: Data.Fixed had no NFData instances yet at time of writing+    rnf ndt = seq ndt ()++instance Enum NominalDiffTime where+    succ (MkNominalDiffTime a) = MkNominalDiffTime (succ a)+    pred (MkNominalDiffTime a) = MkNominalDiffTime (pred a)+    toEnum = MkNominalDiffTime . toEnum+    fromEnum (MkNominalDiffTime a) = fromEnum a+    enumFrom (MkNominalDiffTime a) = fmap MkNominalDiffTime (enumFrom a)+    enumFromThen (MkNominalDiffTime a) (MkNominalDiffTime b) = fmap MkNominalDiffTime (enumFromThen a b)+    enumFromTo (MkNominalDiffTime a) (MkNominalDiffTime b) = fmap MkNominalDiffTime (enumFromTo a b)+    enumFromThenTo (MkNominalDiffTime a) (MkNominalDiffTime b) (MkNominalDiffTime c) = fmap MkNominalDiffTime (enumFromThenTo a b c)++instance Show NominalDiffTime where+    show (MkNominalDiffTime t) = (showFixed True t) ++ "s"++-- necessary because H98 doesn't have "cunning newtype" derivation+instance Num NominalDiffTime where+    (MkNominalDiffTime a) + (MkNominalDiffTime b) = MkNominalDiffTime (a + b)+    (MkNominalDiffTime a) - (MkNominalDiffTime b) = MkNominalDiffTime (a - b)+    (MkNominalDiffTime a) * (MkNominalDiffTime b) = MkNominalDiffTime (a * b)+    negate (MkNominalDiffTime a) = MkNominalDiffTime (negate a)+    abs (MkNominalDiffTime a) = MkNominalDiffTime (abs a)+    signum (MkNominalDiffTime a) = MkNominalDiffTime (signum a)+    fromInteger i = MkNominalDiffTime (fromInteger i)++-- necessary because H98 doesn't have "cunning newtype" derivation+instance Real NominalDiffTime where+    toRational (MkNominalDiffTime a) = toRational a++-- necessary because H98 doesn't have "cunning newtype" derivation+instance Fractional NominalDiffTime where+    (MkNominalDiffTime a) / (MkNominalDiffTime b) = MkNominalDiffTime (a / b)+    recip (MkNominalDiffTime a) = MkNominalDiffTime (recip a)+    fromRational r = MkNominalDiffTime (fromRational r)++-- necessary because H98 doesn't have "cunning newtype" derivation+instance RealFrac NominalDiffTime where+    properFraction (MkNominalDiffTime a) = (i,MkNominalDiffTime f) where+        (i,f) = properFraction a+    truncate (MkNominalDiffTime a) = truncate a+    round (MkNominalDiffTime a) = round a+    ceiling (MkNominalDiffTime a) = ceiling a+    floor (MkNominalDiffTime a) = floor a++{-# RULES+"realToFrac/DiffTime->NominalDiffTime"   realToFrac = \ dt -> MkNominalDiffTime (realToFrac dt)+"realToFrac/NominalDiffTime->DiffTime"   realToFrac = \ (MkNominalDiffTime ps) -> realToFrac ps++"realToFrac/NominalDiffTime->Pico"       realToFrac = \ (MkNominalDiffTime ps) -> ps+"realToFrac/Pico->NominalDiffTime"       realToFrac = MkNominalDiffTime+  #-}++-- | One day in 'NominalDiffTime'.+nominalDay :: NominalDiffTime+nominalDay = 86400
+ lib/Data/Time/Clock/Internal/POSIXTime.hs view
@@ -0,0 +1,14 @@+module Data.Time.Clock.Internal.POSIXTime where++import Data.Time.Clock.Internal.NominalDiffTime+++-- | 86400 nominal seconds in every day+posixDayLength :: NominalDiffTime+posixDayLength = nominalDay++-- | POSIX time is the nominal time since 1970-01-01 00:00 UTC+--+-- To convert from a 'Foreign.C.CTime' or 'System.Posix.EpochTime', use 'realToFrac'.+--+type POSIXTime = NominalDiffTime
+ lib/Data/Time/Clock/Internal/SystemTime.hs view
@@ -0,0 +1,94 @@+#if __GLASGOW_HASKELL__ >= 710+{-# OPTIONS -fno-warn-trustworthy-safe #-}+#endif+{-# LANGUAGE Trustworthy #-}+module Data.Time.Clock.Internal.SystemTime+    (+    SystemTime(..),+    getSystemTime,+    getTime_resolution,+    getTAISystemTime,+    ) where++import Data.Int (Int64)+import Data.Word+import Control.DeepSeq+import Data.Time.Clock.Internal.DiffTime++#include "HsTimeConfig.h"++#ifdef mingw32_HOST_OS+import qualified System.Win32.Time as Win32+#elif HAVE_CLOCK_GETTIME+import Data.Time.Clock.Internal.CTimespec+import Foreign.C.Types (CTime(..), CLong(..))+#else+import Data.Time.Clock.Internal.CTimeval+import Foreign.C.Types (CLong(..))+#endif++--------------------------------------------------------------------------------++-- | 'SystemTime' is time returned by system clock functions.+-- Its semantics depends on the clock function, but the epoch is typically the beginning of 1970.+-- Note that 'systemNanoseconds' of 1E9 to 2E9-1 can be used to represent leap seconds.+data SystemTime = MkSystemTime+    { systemSeconds ::     {-# UNPACK #-} !Int64+    , systemNanoseconds :: {-# UNPACK #-} !Word32+    } deriving (Eq,Ord,Show)++instance NFData SystemTime where+    rnf a = a `seq` ()++-- | Get the system time, epoch start of 1970 UTC, leap-seconds ignored.+-- 'getSystemTime' is typically much faster than 'getCurrentTime'.+getSystemTime :: IO SystemTime++-- | The resolution of 'getSystemTime', 'getCurrentTime', 'getPOSIXTime'+getTime_resolution :: DiffTime++-- | If supported, get TAI time, epoch start of 1970 TAI, with resolution.+-- This is supported only on UNIX systems, and only those with CLOCK_TAI available at run-time.+getTAISystemTime :: Maybe (DiffTime,IO SystemTime)++#ifdef mingw32_HOST_OS+-- On Windows, the equlvalent of POSIX time is "file time", defined as+-- the number of 100-nanosecond intervals that have elapsed since+-- 12:00 A.M. January 1, 1601 (UTC).  We can convert this into a POSIX+-- time by adjusting the offset to be relative to the POSIX epoch.++getSystemTime = do+    Win32.FILETIME ft <- Win32.getSystemTimeAsFileTime+    let (s, us) = (ft - win32_epoch_adjust) `divMod` 10000000+    return (MkSystemTime (fromIntegral s) (fromIntegral us * 100))+  where+    win32_epoch_adjust :: Word64+    win32_epoch_adjust = 116444736000000000+getTime_resolution = 100E-9 -- 100ns+getTAISystemTime = Nothing++#elif HAVE_CLOCK_GETTIME+-- Use hi-res clock_gettime++timespecToSystemTime :: CTimespec -> SystemTime+timespecToSystemTime (MkCTimespec (CTime s) (CLong ns)) = (MkSystemTime (fromIntegral s) (fromIntegral ns))++timespecToDiffTime :: CTimespec -> DiffTime+timespecToDiffTime (MkCTimespec (CTime s) ns) = (fromIntegral s) + (fromIntegral ns) * 1E-9++clockGetSystemTime :: ClockID -> IO SystemTime+clockGetSystemTime clock = fmap timespecToSystemTime $ clockGetTime clock++getSystemTime = clockGetSystemTime clock_REALTIME+getTime_resolution = timespecToDiffTime realtimeRes+getTAISystemTime = fmap (\resolution -> (timespecToDiffTime resolution,clockGetSystemTime clock_TAI)) $ clockResolution clock_TAI++#else+-- Use gettimeofday+getSystemTime = do+    MkCTimeval (CLong s) (CLong us) <- getCTimeval+    return (MkSystemTime (fromIntegral s) (fromIntegral us * 1000))+getTime_resolution = 1E-6 -- microsecond+getTAISystemTime = Nothing++#endif
+ lib/Data/Time/Clock/Internal/UTCDiff.hs view
@@ -0,0 +1,14 @@+-- #hide+module Data.Time.Clock.Internal.UTCDiff where++import Data.Time.Clock.Internal.NominalDiffTime+import Data.Time.Clock.Internal.UTCTime+import Data.Time.Clock.POSIX++-- | addUTCTime a b = a + b+addUTCTime :: NominalDiffTime -> UTCTime -> UTCTime+addUTCTime x t = posixSecondsToUTCTime (x + (utcTimeToPOSIXSeconds t))++-- | diffUTCTime a b = a - b+diffUTCTime :: UTCTime -> UTCTime -> NominalDiffTime+diffUTCTime a b = (utcTimeToPOSIXSeconds a) - (utcTimeToPOSIXSeconds b)
+ lib/Data/Time/Clock/Internal/UTCTime.hs view
@@ -0,0 +1,51 @@+#include "HsConfigure.h"+module Data.Time.Clock.Internal.UTCTime+(+    -- * UTC+    -- | UTC is time as measured by a clock, corrected to keep pace with the earth by adding or removing+    -- occasional seconds, known as \"leap seconds\".+    -- These corrections are not predictable and are announced with six month's notice.+    -- No table of these corrections is provided, as any program compiled with it would become+    -- out of date in six months.+    --+    -- If you don't care about leap seconds, use 'UTCTime' and 'NominalDiffTime' for your clock calculations,+    -- and you'll be fine.+    UTCTime(..),+) where++import Data.Typeable+#if LANGUAGE_Rank2Types+import Data.Data+#endif+import Control.DeepSeq+import Data.Time.Calendar.Days+import Data.Time.Clock.Internal.DiffTime+++-- | This is the simplest representation of UTC.+-- It consists of the day number, and a time offset from midnight.+-- Note that if a day has a leap second added to it, it will have 86401 seconds.+data UTCTime = UTCTime {+    -- | the day+    utctDay :: Day,+    -- | the time from midnight, 0 <= t < 86401s (because of leap-seconds)+    utctDayTime :: DiffTime+}+#if LANGUAGE_DeriveDataTypeable+#if LANGUAGE_Rank2Types+#if HAS_DataPico+    deriving (Data, Typeable)+#endif+#endif+#endif++instance NFData UTCTime where+    rnf (UTCTime d t) = rnf d `seq` rnf t `seq` ()++instance Eq UTCTime where+    (UTCTime da ta) == (UTCTime db tb) = (da == db) && (ta == tb)++instance Ord UTCTime where+    compare (UTCTime da ta) (UTCTime db tb) = case (compare da db) of+        EQ -> compare ta tb+        cmp -> cmp
+ lib/Data/Time/Clock/Internal/UniversalTime.hs view
@@ -0,0 +1,28 @@+#include "HsConfigure.h"+module Data.Time.Clock.Internal.UniversalTime+    (+    -- * Universal Time+    -- | Time as measured by the Earth.+    UniversalTime(..),+    ) where++import Data.Typeable+#if LANGUAGE_Rank2Types+import Data.Data+#endif+import Control.DeepSeq+++-- | The Modified Julian Date is the day with the fraction of the day, measured from UT midnight.+-- It's used to represent UT1, which is time as measured by the earth's rotation, adjusted for various wobbles.+newtype UniversalTime = ModJulianDate {getModJulianDate :: Rational} deriving (Eq,Ord+#if LANGUAGE_DeriveDataTypeable+#if LANGUAGE_Rank2Types+    ,Data, Typeable+#endif+#endif+    )++-- necessary because H98 doesn't have "cunning newtype" derivation+instance NFData UniversalTime where+    rnf (ModJulianDate a) = rnf a
lib/Data/Time/Clock/POSIX.hs view
@@ -2,83 +2,32 @@ -- Most people won't need this module. module Data.Time.Clock.POSIX (-    posixDayLength,POSIXTime,posixSecondsToUTCTime,utcTimeToPOSIXSeconds,getPOSIXTime,getCurrentTime+    posixDayLength,POSIXTime,posixSecondsToUTCTime,utcTimeToPOSIXSeconds,getPOSIXTime,getCurrentTime,+    systemToPOSIXTime, ) where -import Data.Time.Clock.UTC+import Data.Time.Clock.Internal.POSIXTime+import Data.Time.Clock.Internal.UTCTime+import Data.Time.Clock.System import Data.Time.Calendar.Days import Data.Fixed-import Control.Monad -#include "HsTimeConfig.h"--#ifdef mingw32_HOST_OS-import Data.Word    ( Word64)-import System.Win32.Time-#elif HAVE_CLOCK_GETTIME-import Data.Time.Clock.CTimespec-import Foreign.C.Types (CTime(..))-#else-import Data.Time.Clock.CTimeval-#endif---- | 86400 nominal seconds in every day-posixDayLength :: NominalDiffTime-posixDayLength = 86400---- | POSIX time is the nominal time since 1970-01-01 00:00 UTC------ To convert from a 'Foreign.C.CTime' or 'System.Posix.EpochTime', use 'realToFrac'.----type POSIXTime = NominalDiffTime--unixEpochDay :: Day-unixEpochDay = ModifiedJulianDay 40587- posixSecondsToUTCTime :: POSIXTime -> UTCTime posixSecondsToUTCTime i = let     (d,t) = divMod' i posixDayLength- in UTCTime (addDays d unixEpochDay) (realToFrac t)+ in UTCTime (addDays d systemEpochDay) (realToFrac t)  utcTimeToPOSIXSeconds :: UTCTime -> POSIXTime utcTimeToPOSIXSeconds (UTCTime d t) =- (fromInteger (diffDays d unixEpochDay) * posixDayLength) + min posixDayLength (realToFrac t)+ (fromInteger (diffDays d systemEpochDay) * posixDayLength) + min posixDayLength (realToFrac t) +systemToPOSIXTime :: SystemTime -> POSIXTime+systemToPOSIXTime (MkSystemTime s ns) = (fromIntegral s) + (fromIntegral ns) * 1E-9+ -- | Get the current POSIX time from the system clock. getPOSIXTime :: IO POSIXTime--#ifdef mingw32_HOST_OS--- On Windows, the equlvalent of POSIX time is "file time", defined as--- the number of 100-nanosecond intervals that have elapsed since--- 12:00 A.M. January 1, 1601 (UTC).  We can convert this into a POSIX--- time by adjusting the offset to be relative to the POSIX epoch.--getPOSIXTime = do-  FILETIME ft <- System.Win32.Time.getSystemTimeAsFileTime-  return (fromIntegral (ft - win32_epoch_adjust) / 10000000)--win32_epoch_adjust :: Word64-win32_epoch_adjust = 116444736000000000--#elif HAVE_CLOCK_GETTIME---- Use hi-res POSIX time-ctimespecToPosixSeconds :: CTimespec -> POSIXTime-ctimespecToPosixSeconds (MkCTimespec (CTime s) ns) =-    (fromIntegral s) + (fromIntegral ns) / 1000000000--getPOSIXTime = liftM ctimespecToPosixSeconds getCTimespec--#else---- Use POSIX time-ctimevalToPosixSeconds :: CTimeval -> POSIXTime-ctimevalToPosixSeconds (MkCTimeval s mus) = (fromIntegral s) + (fromIntegral mus) / 1000000--getPOSIXTime = liftM ctimevalToPosixSeconds getCTimeval--#endif+getPOSIXTime = fmap systemToPOSIXTime getSystemTime --- | Get the current UTC time from the system clock.+-- | Get the current 'UTCTime' from the system clock. getCurrentTime :: IO UTCTime-getCurrentTime = liftM posixSecondsToUTCTime getPOSIXTime+getCurrentTime = systemToUTCTime `fmap` getSystemTime
− lib/Data/Time/Clock/Scale.hs
@@ -1,117 +0,0 @@-#if __GLASGOW_HASKELL__ >= 702-{-# LANGUAGE Trustworthy #-}-#endif-{-# OPTIONS -fno-warn-unused-imports #-}-#include "HsConfigure.h"--- #hide-module Data.Time.Clock.Scale-(-    -- * Universal Time-    -- | Time as measured by the earth.-    UniversalTime(..),--    -- * Absolute intervals-    DiffTime,-    secondsToDiffTime,-    picosecondsToDiffTime,-    diffTimeToPicoseconds,-) where--import Control.DeepSeq-import Data.Ratio ((%))-import Data.Fixed-import Data.Typeable-#if LANGUAGE_Rank2Types-import Data.Data-#endif---- | The Modified Julian Date is the day with the fraction of the day, measured from UT midnight.--- It's used to represent UT1, which is time as measured by the earth's rotation, adjusted for various wobbles.-newtype UniversalTime = ModJulianDate {getModJulianDate :: Rational} deriving (Eq,Ord-#if LANGUAGE_DeriveDataTypeable-#if LANGUAGE_Rank2Types-    ,Data, Typeable-#endif-#endif-    )---- necessary because H98 doesn't have "cunning newtype" derivation-instance NFData UniversalTime where-    rnf (ModJulianDate a) = rnf a---- | This is a length of time, as measured by a clock.--- Conversion functions will treat it as seconds.--- It has a precision of 10^-12 s.-newtype DiffTime = MkDiffTime Pico deriving (Eq,Ord-#if LANGUAGE_DeriveDataTypeable-#if LANGUAGE_Rank2Types-#if HAS_DataPico-    ,Data, Typeable-#else-#endif-#endif-#endif-    )---- necessary because H98 doesn't have "cunning newtype" derivation-instance NFData DiffTime where -- FIXME: Data.Fixed had no NFData instances yet at time of writing-        rnf dt = seq dt ()---- necessary because H98 doesn't have "cunning newtype" derivation-instance Enum DiffTime where-    succ (MkDiffTime a) = MkDiffTime (succ a)-    pred (MkDiffTime a) = MkDiffTime (pred a)-    toEnum = MkDiffTime . toEnum-    fromEnum (MkDiffTime a) = fromEnum a-    enumFrom (MkDiffTime a) = fmap MkDiffTime (enumFrom a)-    enumFromThen (MkDiffTime a) (MkDiffTime b) = fmap MkDiffTime (enumFromThen a b)-    enumFromTo (MkDiffTime a) (MkDiffTime b) = fmap MkDiffTime (enumFromTo a b)-    enumFromThenTo (MkDiffTime a) (MkDiffTime b) (MkDiffTime c) = fmap MkDiffTime (enumFromThenTo a b c)--instance Show DiffTime where-    show (MkDiffTime t) = (showFixed True t) ++ "s"---- necessary because H98 doesn't have "cunning newtype" derivation-instance Num DiffTime where-    (MkDiffTime a) + (MkDiffTime b) = MkDiffTime (a + b)-    (MkDiffTime a) - (MkDiffTime b) = MkDiffTime (a - b)-    (MkDiffTime a) * (MkDiffTime b) = MkDiffTime (a * b)-    negate (MkDiffTime a) = MkDiffTime (negate a)-    abs (MkDiffTime a) = MkDiffTime (abs a)-    signum (MkDiffTime a) = MkDiffTime (signum a)-    fromInteger i = MkDiffTime (fromInteger i)---- necessary because H98 doesn't have "cunning newtype" derivation-instance Real DiffTime where-    toRational (MkDiffTime a) = toRational a---- necessary because H98 doesn't have "cunning newtype" derivation-instance Fractional DiffTime where-    (MkDiffTime a) / (MkDiffTime b) = MkDiffTime (a / b)-    recip (MkDiffTime a) = MkDiffTime (recip a)-    fromRational r = MkDiffTime (fromRational r)---- necessary because H98 doesn't have "cunning newtype" derivation-instance RealFrac DiffTime where-    properFraction (MkDiffTime a) = let (b',a') = properFraction a in (b',MkDiffTime a')-    truncate (MkDiffTime a) = truncate a-    round (MkDiffTime a) = round a-    ceiling (MkDiffTime a) = ceiling a-    floor (MkDiffTime a) = floor a---- | Create a 'DiffTime' which represents an integral number of seconds.-secondsToDiffTime :: Integer -> DiffTime-secondsToDiffTime = fromInteger---- | Create a 'DiffTime' from a number of picoseconds.-picosecondsToDiffTime :: Integer -> DiffTime-picosecondsToDiffTime x = MkDiffTime (MkFixed x)---- | Get the number of picoseconds in a 'DiffTime'.-diffTimeToPicoseconds :: DiffTime -> Integer-diffTimeToPicoseconds (MkDiffTime (MkFixed x)) = x--{-# RULES-"realToFrac/DiffTime->Pico"              realToFrac = \ (MkDiffTime ps) -> ps-"realToFrac/Pico->DiffTime"              realToFrac = MkDiffTime-  #-}
+ lib/Data/Time/Clock/System.hs view
@@ -0,0 +1,80 @@+-- | Fast access to the system clock.+module Data.Time.Clock.System+(+    systemEpochDay,+    SystemTime(..),+    truncateSystemTimeLeapSecond,+    getSystemTime,+    systemToUTCTime,+    utcToSystemTime,+    systemToTAITime,+) where++import Data.Time.Clock.Internal.AbsoluteTime+import Data.Time.Clock.Internal.DiffTime+import Data.Time.Clock.Internal.SystemTime+import Data.Time.Clock.Internal.UTCTime+import Data.Time.Calendar.Days+import Data.Int (Int64)+++-- | Map leap-second values to the start of the following second.+-- The resulting 'systemNanoseconds' will always be in the range 0 to 1E9-1.+truncateSystemTimeLeapSecond :: SystemTime -> SystemTime+truncateSystemTimeLeapSecond (MkSystemTime seconds nanoseconds) | nanoseconds >= 1000000000 = MkSystemTime (succ seconds) 0+truncateSystemTimeLeapSecond t = t++-- | Convert 'SystemTime' to 'UTCTime', matching zero 'SystemTime' to midnight of 'systemEpochDay' UTC.+systemToUTCTime :: SystemTime -> UTCTime+systemToUTCTime (MkSystemTime seconds nanoseconds) = let+    days :: Int64+    timeSeconds :: Int64+    (days, timeSeconds) = seconds `divMod` 86400++    day :: Day+    day = addDays (fromIntegral days) systemEpochDay++    timeNanoseconds :: Int64+    timeNanoseconds = timeSeconds * 1000000000 + (fromIntegral nanoseconds)++    timePicoseconds :: Int64+    timePicoseconds = timeNanoseconds * 1000++    time :: DiffTime+    time = picosecondsToDiffTime $ fromIntegral timePicoseconds+    in UTCTime day time++-- | Convert 'UTCTime' to 'SystemTime', matching zero 'SystemTime' to midnight of 'systemEpochDay' UTC.+utcToSystemTime :: UTCTime -> SystemTime+utcToSystemTime (UTCTime day time) = let+    days :: Int64+    days = fromIntegral $ diffDays day systemEpochDay++    timePicoseconds :: Int64+    timePicoseconds = fromIntegral $ diffTimeToPicoseconds time++    timeNanoseconds :: Int64+    timeNanoseconds = timePicoseconds `div` 1000++    timeSeconds :: Int64+    nanoseconds :: Int64+    (timeSeconds,nanoseconds) = if timeNanoseconds >= 86400000000000 then (86399,timeNanoseconds - 86399000000000) else timeNanoseconds `divMod` 1000000000++    seconds :: Int64+    seconds = days * 86400 + timeSeconds++    in MkSystemTime seconds $ fromIntegral nanoseconds++systemEpochAbsolute :: AbsoluteTime+systemEpochAbsolute = taiNominalDayStart systemEpochDay++-- | Convert 'SystemTime' to 'AbsoluteTime', matching zero 'SystemTime' to midnight of 'systemEpochDay' TAI.+systemToTAITime :: SystemTime -> AbsoluteTime+systemToTAITime (MkSystemTime s ns) = let+    diff :: DiffTime+    diff = (fromIntegral s) + (fromIntegral ns) * 1E-9+    in addAbsoluteTime diff systemEpochAbsolute++-- | The day of the epoch of 'SystemTime', 1970-01-01+systemEpochDay :: Day+systemEpochDay = ModifiedJulianDay 40587
lib/Data/Time/Clock/TAI.hs view
@@ -1,58 +1,32 @@-{-# OPTIONS -fno-warn-unused-imports #-}+{-# OPTIONS -fno-warn-orphans #-} #include "HsConfigure.h" -- | TAI and leap-second maps for converting to UTC: most people won't need this module. module Data.Time.Clock.TAI (     -- TAI arithmetic-    AbsoluteTime,taiEpoch,addAbsoluteTime,diffAbsoluteTime,+    module Data.Time.Clock.Internal.AbsoluteTime,      -- leap-second map type     LeapSecondMap,      -- conversion between UTC and TAI with map     utcDayLength,utcToTAITime,taiToUTCTime,++    taiClock, ) where +import Data.Time.Clock.Internal.AbsoluteTime import Data.Time.LocalTime import Data.Time.Calendar.Days+import Data.Time.Clock.Internal.SystemTime+import Data.Time.Clock.System import Data.Time.Clock-import Control.DeepSeq import Data.Maybe-import Data.Typeable import Data.Fixed-#if LANGUAGE_Rank2Types-import Data.Data-#endif --- | AbsoluteTime is TAI, time as measured by a clock.-newtype AbsoluteTime = MkAbsoluteTime DiffTime deriving (Eq,Ord-#if LANGUAGE_DeriveDataTypeable-#if LANGUAGE_Rank2Types-#if HAS_DataPico-    ,Data, Typeable-#endif-#endif-#endif-    )--instance NFData AbsoluteTime where-    rnf (MkAbsoluteTime a) = rnf a- instance Show AbsoluteTime where     show t = show (utcToLocalTime utc (fromJust (taiToUTCTime (const (Just 0)) t))) ++ " TAI" -- ugly, but standard apparently --- | The epoch of TAI, which is 1858-11-17 00:00:00 TAI.-taiEpoch :: AbsoluteTime-taiEpoch = MkAbsoluteTime 0---- | addAbsoluteTime a b = a + b-addAbsoluteTime :: DiffTime -> AbsoluteTime -> AbsoluteTime-addAbsoluteTime t (MkAbsoluteTime a) = MkAbsoluteTime (a + t)---- | diffAbsoluteTime a b = a - b-diffAbsoluteTime :: AbsoluteTime -> AbsoluteTime -> DiffTime-diffAbsoluteTime (MkAbsoluteTime a) (MkAbsoluteTime b) = a - b- -- | TAI - UTC during this day. -- No table is provided, as any program compiled with it would become -- out of date in six months.@@ -84,3 +58,7 @@             day' = addDays (div' dtime len) day         if day == day' then return (UTCTime day dtime) else stable day'     in stable $ ModifiedJulianDay $ div' (diffAbsoluteTime abstime taiEpoch) 86400++-- | TAI clock, if it exists. Note that it is unlikely to be set correctly, without due care and attention.+taiClock :: Maybe (DiffTime,IO AbsoluteTime)+taiClock = fmap (fmap (fmap systemToTAITime)) getTAISystemTime
− lib/Data/Time/Clock/UTC.hs
@@ -1,126 +0,0 @@-{-# OPTIONS -fno-warn-unused-imports #-}-#if __GLASGOW_HASKELL__ >= 702-{-# LANGUAGE Trustworthy #-}-#endif-#include "HsConfigure.h"--- #hide-module Data.Time.Clock.UTC-(-    -- * UTC-    -- | UTC is time as measured by a clock, corrected to keep pace with the earth by adding or removing-    -- occasional seconds, known as \"leap seconds\".-    -- These corrections are not predictable and are announced with six month's notice.-    -- No table of these corrections is provided, as any program compiled with it would become-    -- out of date in six months.-    ---    -- If you don't care about leap seconds, use UTCTime and NominalDiffTime for your clock calculations,-    -- and you'll be fine.-    UTCTime(..),NominalDiffTime-) where--import Control.DeepSeq-import Data.Time.Calendar.Days-import Data.Time.Clock.Scale-import Data.Fixed-import Data.Typeable-#if LANGUAGE_Rank2Types-import Data.Data-#endif---- | This is the simplest representation of UTC.--- It consists of the day number, and a time offset from midnight.--- Note that if a day has a leap second added to it, it will have 86401 seconds.-data UTCTime = UTCTime {-    -- | the day-    utctDay :: Day,-    -- | the time from midnight, 0 <= t < 86401s (because of leap-seconds)-    utctDayTime :: DiffTime-}-#if LANGUAGE_DeriveDataTypeable-#if LANGUAGE_Rank2Types-#if HAS_DataPico-    deriving (Data, Typeable)-#endif-#endif-#endif--instance NFData UTCTime where-    rnf (UTCTime d t) = d `deepseq` t `deepseq` ()--instance Eq UTCTime where-    (UTCTime da ta) == (UTCTime db tb) = (da == db) && (ta == tb)--instance Ord UTCTime where-    compare (UTCTime da ta) (UTCTime db tb) = case (compare da db) of-        EQ -> compare ta tb-        cmp -> cmp---- | This is a length of time, as measured by UTC.--- Conversion functions will treat it as seconds.--- It has a precision of 10^-12 s.--- It ignores leap-seconds, so it's not necessarily a fixed amount of clock time.--- For instance, 23:00 UTC + 2 hours of NominalDiffTime = 01:00 UTC (+ 1 day),--- regardless of whether a leap-second intervened.-newtype NominalDiffTime = MkNominalDiffTime Pico deriving (Eq,Ord-#if LANGUAGE_DeriveDataTypeable-#if LANGUAGE_Rank2Types-#if HAS_DataPico-    ,Data, Typeable-#endif-#endif-#endif-    )---- necessary because H98 doesn't have "cunning newtype" derivation-instance NFData NominalDiffTime where -- FIXME: Data.Fixed had no NFData instances yet at time of writing-        rnf ndt = seq ndt ()--instance Enum NominalDiffTime where-    succ (MkNominalDiffTime a) = MkNominalDiffTime (succ a)-    pred (MkNominalDiffTime a) = MkNominalDiffTime (pred a)-    toEnum = MkNominalDiffTime . toEnum-    fromEnum (MkNominalDiffTime a) = fromEnum a-    enumFrom (MkNominalDiffTime a) = fmap MkNominalDiffTime (enumFrom a)-    enumFromThen (MkNominalDiffTime a) (MkNominalDiffTime b) = fmap MkNominalDiffTime (enumFromThen a b)-    enumFromTo (MkNominalDiffTime a) (MkNominalDiffTime b) = fmap MkNominalDiffTime (enumFromTo a b)-    enumFromThenTo (MkNominalDiffTime a) (MkNominalDiffTime b) (MkNominalDiffTime c) = fmap MkNominalDiffTime (enumFromThenTo a b c)--instance Show NominalDiffTime where-    show (MkNominalDiffTime t) = (showFixed True t) ++ "s"---- necessary because H98 doesn't have "cunning newtype" derivation-instance Num NominalDiffTime where-    (MkNominalDiffTime a) + (MkNominalDiffTime b) = MkNominalDiffTime (a + b)-    (MkNominalDiffTime a) - (MkNominalDiffTime b) = MkNominalDiffTime (a - b)-    (MkNominalDiffTime a) * (MkNominalDiffTime b) = MkNominalDiffTime (a * b)-    negate (MkNominalDiffTime a) = MkNominalDiffTime (negate a)-    abs (MkNominalDiffTime a) = MkNominalDiffTime (abs a)-    signum (MkNominalDiffTime a) = MkNominalDiffTime (signum a)-    fromInteger i = MkNominalDiffTime (fromInteger i)---- necessary because H98 doesn't have "cunning newtype" derivation-instance Real NominalDiffTime where-    toRational (MkNominalDiffTime a) = toRational a---- necessary because H98 doesn't have "cunning newtype" derivation-instance Fractional NominalDiffTime where-    (MkNominalDiffTime a) / (MkNominalDiffTime b) = MkNominalDiffTime (a / b)-    recip (MkNominalDiffTime a) = MkNominalDiffTime (recip a)-    fromRational r = MkNominalDiffTime (fromRational r)---- necessary because H98 doesn't have "cunning newtype" derivation-instance RealFrac NominalDiffTime where-    properFraction (MkNominalDiffTime a) = (i,MkNominalDiffTime f) where-        (i,f) = properFraction a-    truncate (MkNominalDiffTime a) = truncate a-    round (MkNominalDiffTime a) = round a-    ceiling (MkNominalDiffTime a) = ceiling a-    floor (MkNominalDiffTime a) = floor a--{-# RULES-"realToFrac/DiffTime->NominalDiffTime"   realToFrac = \ dt -> MkNominalDiffTime (realToFrac dt)-"realToFrac/NominalDiffTime->DiffTime"   realToFrac = \ (MkNominalDiffTime ps) -> realToFrac ps--"realToFrac/NominalDiffTime->Pico"       realToFrac = \ (MkNominalDiffTime ps) -> ps-"realToFrac/Pico->NominalDiffTime"       realToFrac = MkNominalDiffTime-  #-}
− lib/Data/Time/Clock/UTCDiff.hs
@@ -1,13 +0,0 @@--- #hide-module Data.Time.Clock.UTCDiff where--import Data.Time.Clock.POSIX-import Data.Time.Clock.UTC---- | addUTCTime a b = a + b-addUTCTime :: NominalDiffTime -> UTCTime -> UTCTime-addUTCTime x t = posixSecondsToUTCTime (x + (utcTimeToPOSIXSeconds t))---- | diffUTCTime a b = a - b-diffUTCTime :: UTCTime -> UTCTime -> NominalDiffTime-diffUTCTime a b = (utcTimeToPOSIXSeconds a) - (utcTimeToPOSIXSeconds b)
lib/Data/Time/Format.hs view
@@ -5,47 +5,74 @@     module Data.Time.Format.Parse     ) where -import Data.Time.Format.Parse+import Data.Maybe+import Data.Char+import Data.Fixed -import Data.Time.LocalTime.TimeZone-import Data.Time.LocalTime.TimeOfDay-import Data.Time.LocalTime.LocalTime+import Data.Time.Clock.Internal.UniversalTime+import Data.Time.Clock.Internal.UTCTime+import Data.Time.Clock.POSIX import Data.Time.Calendar.Days import Data.Time.Calendar.Gregorian import Data.Time.Calendar.WeekDate import Data.Time.Calendar.OrdinalDate import Data.Time.Calendar.Private-import Data.Time.Clock.Scale-import Data.Time.Clock.UTC-import Data.Time.Clock.POSIX+import Data.Time.LocalTime.Internal.TimeZone+import Data.Time.LocalTime.Internal.TimeOfDay+import Data.Time.LocalTime.Internal.LocalTime+import Data.Time.LocalTime.Internal.ZonedTime+import Data.Time.Format.Parse -import Data.Maybe-import Data.Char-import Data.Fixed +type NumericPadOption = Maybe Char++-- the weird UNIX logic is here+getPadOption :: Bool -> Bool -> Int -> Char -> Maybe NumericPadOption -> Maybe Int -> PadOption+getPadOption trunc fdef idef cdef mnpad mi = let+    c = case mnpad of+        Just (Just c') -> c'+        Just Nothing -> ' '+        _ -> cdef+    i = case mi of+        Just i' -> case mnpad of+            Just Nothing -> i'+            _ -> if trunc then i' else max i' idef+        Nothing -> idef+    f = case mi of+        Just _ -> True+        Nothing -> case mnpad of+            Nothing -> fdef+            Just Nothing -> False+            Just (Just _) -> True+    in if f then Pad i c else NoPad++padGeneral :: Bool -> Bool -> Int -> Char -> (TimeLocale -> PadOption -> t -> String) -> (TimeLocale -> Maybe NumericPadOption -> Maybe Int -> t -> String)+padGeneral trunc fdef idef cdef ff locale mnpad mi = ff locale $ getPadOption trunc fdef idef cdef mnpad mi++padString :: (TimeLocale -> t -> String) -> (TimeLocale -> Maybe NumericPadOption -> Maybe Int -> t -> String)+padString ff = padGeneral False False 1 ' ' $ \locale pado -> showPadded pado . ff locale++padNum :: (Show i,Ord i,Num i) => Bool -> Int -> Char -> (t -> i) -> (TimeLocale -> Maybe NumericPadOption -> Maybe Int -> t -> String)+padNum fdef idef cdef ff = padGeneral False fdef idef cdef $ \_ pado -> showPaddedNum pado . ff+ -- <http://www.opengroup.org/onlinepubs/007908799/xsh/strftime.html> class FormatTime t where-    formatCharacter :: Char -> Maybe (TimeLocale -> Maybe NumericPadOption -> t -> String)+    formatCharacter :: Char -> Maybe (TimeLocale -> Maybe NumericPadOption -> Maybe Int -> t -> String) -formatChar :: (FormatTime t) => Char -> TimeLocale -> Maybe NumericPadOption -> t -> String-formatChar '%' _ _ _ = "%"-formatChar 't' _ _ _ = "\t"-formatChar 'n' _ _ _ = "\n"-formatChar c locale mpado t = case (formatCharacter c) of-    Just f -> f locale mpado t-    _ -> ""+formatChar :: (FormatTime t) => Char -> TimeLocale -> Maybe NumericPadOption -> Maybe Int -> t -> String+formatChar '%' = padString $ \_ _ -> "%"+formatChar 't' = padString $ \_ _ -> "\t"+formatChar 'n' = padString $ \_ _ -> "\n"+formatChar c = case formatCharacter c of+    Just f -> f+    _ -> \_ _ _ _ -> ""  -- | Substitute various time-related information for each %-code in the string, as per 'formatCharacter'. ----- For all types (note these three are done here, not by 'formatCharacter'):------ [@%%@] @%@------ [@%t@] tab------ [@%n@] newline+-- The general form is @%\<modifier\>\<width\>\<specifier\>@, where @\<modifier\>@ and @\<width\>@ are optional. ----- glibc-style modifiers can be used before the letter (here marked as @z@):+-- == @\<modifier\>@+-- glibc-style modifiers can be used before the specifier (here marked as @z@): -- -- [@%-z@] no padding --@@ -57,16 +84,36 @@ -- -- [@%#z@] convert to lower case (consistently, unlike glibc) --+-- == @\<width\>@+-- Width digits can also be used after any modifiers and before the specifier (here marked as @z@), for example:+--+-- [@%4z@] pad to 4 characters (with default padding character)+--+-- [@%_12z@] pad with spaces to 12 characters+--+-- == @\<specifier\>@+--+-- For all types (note these three are done by 'formatTime', not by 'formatCharacter'):+--+-- [@%%@] @%@+--+-- [@%t@] tab+--+-- [@%n@] newline+--+-- === 'TimeZone' -- For 'TimeZone' (and 'ZonedTime' and 'UTCTime'): -- -- [@%z@] timezone offset in the format @-HHMM@. -- -- [@%Z@] timezone name --+-- === 'LocalTime' -- For 'LocalTime' (and 'ZonedTime' and 'UTCTime' and 'UniversalTime'): -- -- [@%c@] as 'dateTimeFmt' @locale@ (e.g. @%a %b %e %H:%M:%S %Z %Y@) --+-- === 'TimeOfDay' -- For 'TimeOfDay' (and 'LocalTime' and 'ZonedTime' and 'UTCTime' and 'UniversalTime'): -- -- [@%R@] same as @%H:%M@@@ -98,6 +145,7 @@ -- [@%Q@] decimal point and fraction of second, up to 12 second decimals, without trailing zeros. -- For a whole number of seconds, @%Q@ produces the empty string. --+-- === 'UTCTime' and 'ZonedTime' -- For 'UTCTime' and 'ZonedTime': -- -- [@%s@] number of whole seconds since the Unix epoch. For times before@@ -105,6 +153,7 @@ -- the decimals are positive, not negative. For example, 0.9 seconds -- before the Unix epoch is formatted as @-1.1@ with @%s%Q@. --+-- === 'Day' -- For 'Day' (and 'LocalTime' and 'ZonedTime' and 'UTCTime' and 'UniversalTime'): -- -- [@%D@] same as @%m\/%d\/%y@@@ -131,10 +180,6 @@ -- -- [@%j@] day of year, 0-padded to three chars, @001@ - @366@ ----- [@%G@] year for Week Date format, no padding. Note @%0G@ and @%_G@ pad to four chars------ [@%g@] year of century for Week Date format, 0-padded to two chars, @00@ - @99@--- -- [@%f@] century for Week Date format, no padding. Note @%0f@ and @%_f@ pad to two chars -- -- [@%V@] week of year for Week Date format, 0-padded to two chars, @01@ - @53@@@ -152,103 +197,146 @@ -- [@%W@] week of year where weeks start on Monday (as 'mondayStartWeek'), 0-padded to two chars, @00@ - @53@ formatTime :: (FormatTime t) => TimeLocale -> String -> t -> String formatTime _ [] _ = ""-formatTime locale ('%':'_':c:cs) t = (formatChar c locale (Just (Just ' ')) t) ++ (formatTime locale cs t)-formatTime locale ('%':'-':c:cs) t = (formatChar c locale (Just Nothing) t) ++ (formatTime locale cs t)-formatTime locale ('%':'0':c:cs) t = (formatChar c locale (Just (Just '0')) t) ++ (formatTime locale cs t)-formatTime locale ('%':'^':c:cs) t = (fmap toUpper (formatChar c locale Nothing t)) ++ (formatTime locale cs t)-formatTime locale ('%':'#':c:cs) t = (fmap toLower (formatChar c locale Nothing t)) ++ (formatTime locale cs t)-formatTime locale ('%':c:cs) t = (formatChar c locale Nothing t) ++ (formatTime locale cs t)+formatTime locale ('%':cs) t = case formatTime1 locale cs t of+    Just result -> result+    Nothing -> '%':(formatTime locale cs t) formatTime locale (c:cs) t = c:(formatTime locale cs t) +formatTime1 :: (FormatTime t) => TimeLocale -> String -> t -> Maybe String+formatTime1 locale ('_':cs) t = formatTime2 locale id (Just (Just ' ')) cs t+formatTime1 locale ('-':cs) t = formatTime2 locale id (Just Nothing) cs t+formatTime1 locale ('0':cs) t = formatTime2 locale id (Just (Just '0')) cs t+formatTime1 locale ('^':cs) t = formatTime2 locale (fmap toUpper) Nothing cs t+formatTime1 locale ('#':cs) t = formatTime2 locale (fmap toLower) Nothing cs t+formatTime1 locale cs t = formatTime2 locale id Nothing cs t++getDigit :: Char -> Maybe Int+getDigit c | c < '0' = Nothing+getDigit c | c > '9' = Nothing+getDigit c = Just $ (ord c) - (ord '0')++pullNumber :: Maybe Int -> String -> (Maybe Int,String)+pullNumber mx [] = (mx,[])+pullNumber mx s@(c:cs) = case getDigit c of+    Just i -> pullNumber (Just $ (fromMaybe 0 mx)*10+i) cs+    Nothing -> (mx,s)++formatTime2 :: (FormatTime t) => TimeLocale -> (String -> String) -> Maybe NumericPadOption -> String -> t -> Maybe String+formatTime2 locale recase mpad cs t = let+    (mwidth,rest) = pullNumber Nothing cs+    in formatTime3 locale recase mpad mwidth rest t++formatTime3 :: (FormatTime t) => TimeLocale -> (String -> String) -> Maybe NumericPadOption -> Maybe Int -> String -> t -> Maybe String+formatTime3 locale recase mpad mwidth (c:cs) t = Just $ (recase (formatChar c locale mpad mwidth t)) ++ (formatTime locale cs t)+formatTime3 _locale _recase _mpad _mwidth [] _t = Nothing+ instance FormatTime LocalTime where-    formatCharacter 'c' = Just (\locale _ -> formatTime locale (dateTimeFmt locale))-    formatCharacter c = case (formatCharacter c) of-        Just f -> Just (\locale mpado dt -> f locale mpado (localDay dt))-        Nothing -> case (formatCharacter c) of-            Just f -> Just (\locale mpado dt -> f locale mpado (localTimeOfDay dt))+    formatCharacter 'c' = Just $ \locale _ _ -> formatTime locale (dateTimeFmt locale)+    formatCharacter c = case formatCharacter c of+        Just f -> Just $ \locale mpado mwidth dt -> f locale mpado mwidth (localDay dt)+        Nothing -> case formatCharacter c of+            Just f -> Just $ \locale mpado mwidth dt -> f locale mpado mwidth (localTimeOfDay dt)             Nothing -> Nothing +todAMPM :: TimeLocale -> TimeOfDay -> String+todAMPM locale day = let+    (am,pm) = amPm locale+    in if (todHour day) < 12 then am else pm++tod12Hour :: TimeOfDay -> Int+tod12Hour day = (mod (todHour day - 1) 12) + 1++showPaddedFixedFraction :: HasResolution a => PadOption -> Fixed a -> String+showPaddedFixedFraction pado x = let+    digits = dropWhile (=='.') $ dropWhile (/='.') $ showFixed True x+    n = length digits+    in case pado of+        NoPad -> digits+        Pad i c -> if i < n+            then take i digits+            else digits ++ replicate (i - n) c+ instance FormatTime TimeOfDay where     -- Aggregate-    formatCharacter 'R' = Just (\locale _ -> formatTime locale "%H:%M")-    formatCharacter 'T' = Just (\locale _ -> formatTime locale "%H:%M:%S")-    formatCharacter 'X' = Just (\locale _ -> formatTime locale (timeFmt locale))-    formatCharacter 'r' = Just (\locale _ -> formatTime locale (time12Fmt locale))+    formatCharacter 'R' = Just $ padString $ \locale -> formatTime locale "%H:%M"+    formatCharacter 'T' = Just $ padString $ \locale -> formatTime locale "%H:%M:%S"+    formatCharacter 'X' = Just $ padString $ \locale -> formatTime locale (timeFmt locale)+    formatCharacter 'r' = Just $ padString $ \locale -> formatTime locale (time12Fmt locale)     -- AM/PM-    formatCharacter 'P' = Just (\locale _ day -> map toLower ((if (todHour day) < 12 then fst else snd) (amPm locale)))-    formatCharacter 'p' = Just (\locale _ day -> (if (todHour day) < 12 then fst else snd) (amPm locale))+    formatCharacter 'P' = Just $ padString $ \locale -> map toLower . todAMPM locale+    formatCharacter 'p' = Just $ padString $ \locale -> todAMPM locale     -- Hour-    formatCharacter 'H' = Just (\_ opt -> (show2 (fromMaybe (Just '0') opt)) . todHour)-    formatCharacter 'I' = Just (\_ opt -> (show2 (fromMaybe (Just '0') opt)) . (\h -> (mod (h - 1) 12) + 1) . todHour)-    formatCharacter 'k' = Just (\_ opt -> (show2 (fromMaybe (Just ' ') opt)) . todHour)-    formatCharacter 'l' = Just (\_ opt -> (show2 (fromMaybe (Just ' ') opt)) . (\h -> (mod (h - 1) 12) + 1) . todHour)+    formatCharacter 'H' = Just $ padNum True  2 '0' todHour+    formatCharacter 'I' = Just $ padNum True  2 '0' tod12Hour+    formatCharacter 'k' = Just $ padNum True  2 ' ' todHour+    formatCharacter 'l' = Just $ padNum True  2 ' ' tod12Hour     -- Minute-    formatCharacter 'M' = Just (\_ opt -> (show2 (fromMaybe (Just '0') opt)) . todMin)+    formatCharacter 'M' = Just $ padNum True  2 '0' todMin     -- Second-    formatCharacter 'S' = Just (\_ opt -> (show2 (fromMaybe (Just '0') opt) :: Int -> String) . truncate . todSec)-    formatCharacter 'q' = Just (\_ _ -> drop 1 . dropWhile (/='.') . showFixed False . todSec)-    formatCharacter 'Q' = Just (\_ _ -> dropWhile (/='.') . showFixed True . todSec)+    formatCharacter 'S' = Just $ padNum True  2 '0' $ (truncate . todSec :: TimeOfDay -> Int)+    formatCharacter 'q' = Just $ padGeneral True True 12 '0' $ \_ pado -> showPaddedFixedFraction pado . todSec+    formatCharacter 'Q' = Just $ padGeneral True False 12 '0' $ \_ pado -> ('.':) . showPaddedFixedFraction pado . todSec      -- Default     formatCharacter _   = Nothing  instance FormatTime ZonedTime where-    formatCharacter 'c' = Just (\locale _ -> formatTime locale (dateTimeFmt locale))-    formatCharacter 's' = Just (\_ _ zt -> show (floor (utcTimeToPOSIXSeconds (zonedTimeToUTC zt)) :: Integer))-    formatCharacter c = case (formatCharacter c) of-        Just f -> Just (\locale mpado dt -> f locale mpado (zonedTimeToLocalTime dt))-        Nothing -> case (formatCharacter c) of-            Just f -> Just (\locale mpado dt -> f locale mpado (zonedTimeZone dt))+    formatCharacter 'c' = Just $ padString $ \locale -> formatTime locale (dateTimeFmt locale)+    formatCharacter 's' = Just $ padNum True  1 '0' $ (floor . utcTimeToPOSIXSeconds . zonedTimeToUTC :: ZonedTime -> Integer)+    formatCharacter c = case formatCharacter c of+        Just f -> Just $ \locale mpado mwidth dt -> f locale mpado mwidth (zonedTimeToLocalTime dt)+        Nothing -> case formatCharacter c of+            Just f -> Just $ \locale mpado mwidth dt -> f locale mpado mwidth (zonedTimeZone dt)             Nothing -> Nothing  instance FormatTime TimeZone where-    formatCharacter 'z' = Just (\_ opt -> timeZoneOffsetString' (fromMaybe (Just '0') opt))-    formatCharacter 'Z' =-            Just (\_ opt z -> let n = timeZoneName z-                           in if null n then timeZoneOffsetString' (fromMaybe (Just '0') opt) z else n)+    formatCharacter 'z' = Just $ padGeneral False True  4 '0' $ \_ pado -> showPadded pado . timeZoneOffsetString'' pado+    formatCharacter 'Z' = Just $ \locale mnpo mi z -> let+        n = timeZoneName z+        in if null n then timeZoneOffsetString'' (getPadOption False True 4 '0' mnpo mi) z else padString (\_ -> timeZoneName) locale mnpo mi z     formatCharacter _ = Nothing  instance FormatTime Day where     -- Aggregate-    formatCharacter 'D' = Just (\locale _ -> formatTime locale "%m/%d/%y")-    formatCharacter 'F' = Just (\locale _ -> formatTime locale "%Y-%m-%d")-    formatCharacter 'x' = Just (\locale _ -> formatTime locale (dateFmt locale))+    formatCharacter 'D' = Just $ padString $ \locale -> formatTime locale "%m/%d/%y"+    formatCharacter 'F' = Just $ padString $ \locale -> formatTime locale "%Y-%m-%d"+    formatCharacter 'x' = Just $ padString $ \locale -> formatTime locale (dateFmt locale)      -- Year Count-    formatCharacter 'Y' = Just (\_ opt -> (show4 (fromMaybe Nothing opt)) . fst . toOrdinalDate)-    formatCharacter 'y' = Just (\_ opt -> (show2 (fromMaybe (Just '0') opt)) . mod100 . fst . toOrdinalDate)-    formatCharacter 'C' = Just (\_ opt -> (show2 (fromMaybe Nothing opt)) . div100 . fst . toOrdinalDate)+    formatCharacter 'Y' = Just $ padNum False 4 '0' $          fst . toOrdinalDate+    formatCharacter 'y' = Just $ padNum True  2 '0' $ mod100 . fst . toOrdinalDate+    formatCharacter 'C' = Just $ padNum False 2 '0' $ div100 . fst . toOrdinalDate     -- Month of Year-    formatCharacter 'B' = Just (\locale _ -> fst . (\(_,m,_) -> (months locale) !! (m - 1)) . toGregorian)-    formatCharacter 'b' = Just (\locale _ -> snd . (\(_,m,_) -> (months locale) !! (m - 1)) . toGregorian)-    formatCharacter 'h' = Just (\locale _ -> snd . (\(_,m,_) -> (months locale) !! (m - 1)) . toGregorian)-    formatCharacter 'm' = Just (\_ opt -> (show2 (fromMaybe (Just '0') opt)) . (\(_,m,_) -> m) . toGregorian)+    formatCharacter 'B' = Just $ padString $ \locale -> fst . (\(_,m,_) -> (months locale) !! (m - 1)) . toGregorian+    formatCharacter 'b' = Just $ padString $ \locale -> snd . (\(_,m,_) -> (months locale) !! (m - 1)) . toGregorian+    formatCharacter 'h' = Just $ padString $ \locale -> snd . (\(_,m,_) -> (months locale) !! (m - 1)) . toGregorian+    formatCharacter 'm' = Just $ padNum True  2 '0' $ (\(_,m,_) -> m) . toGregorian     -- Day of Month-    formatCharacter 'd' = Just (\_ opt -> (show2 (fromMaybe (Just '0') opt)) . (\(_,_,d) -> d) . toGregorian)-    formatCharacter 'e' = Just (\_ opt -> (show2 (fromMaybe (Just ' ') opt)) . (\(_,_,d) -> d) . toGregorian)+    formatCharacter 'd' = Just $ padNum True  2 '0' $ (\(_,_,d) -> d) . toGregorian+    formatCharacter 'e' = Just $ padNum True  2 ' ' $ (\(_,_,d) -> d) . toGregorian     -- Day of Year-    formatCharacter 'j' = Just (\_ opt -> (show3 (fromMaybe (Just '0') opt)) . snd . toOrdinalDate)+    formatCharacter 'j' = Just $ padNum True  3 '0' $ snd . toOrdinalDate      -- ISO 8601 Week Date-    formatCharacter 'G' = Just (\_ opt -> (show4 (fromMaybe Nothing opt)) . (\(y,_,_) -> y) . toWeekDate)-    formatCharacter 'g' = Just (\_ opt -> (show2 (fromMaybe (Just '0') opt)) . mod100 . (\(y,_,_) -> y) . toWeekDate)-    formatCharacter 'f' = Just (\_ opt -> (show2 (fromMaybe Nothing opt)) . div100 . (\(y,_,_) -> y) . toWeekDate)+    formatCharacter 'G' = Just $ padNum False 4 '0' $ (\(y,_,_) -> y) . toWeekDate+    formatCharacter 'g' = Just $ padNum True  2 '0' $ mod100 . (\(y,_,_) -> y) . toWeekDate+    formatCharacter 'f' = Just $ padNum False 2 '0' $ div100 . (\(y,_,_) -> y) . toWeekDate -    formatCharacter 'V' = Just (\_ opt -> (show2 (fromMaybe (Just '0') opt)) . (\(_,w,_) -> w) . toWeekDate)-    formatCharacter 'u' = Just (\_ _ -> show . (\(_,_,d) -> d) . toWeekDate)+    formatCharacter 'V' = Just $ padNum True  2 '0' $ (\(_,w,_) -> w) . toWeekDate+    formatCharacter 'u' = Just $ padNum True  1 '0' $ (\(_,_,d) -> d) . toWeekDate      -- Day of week-    formatCharacter 'a' = Just (\locale _ -> snd . ((wDays locale) !!) . snd . sundayStartWeek)-    formatCharacter 'A' = Just (\locale _ -> fst . ((wDays locale) !!) . snd . sundayStartWeek)-    formatCharacter 'U' = Just (\_ opt -> (show2 (fromMaybe (Just '0') opt)) . fst . sundayStartWeek)-    formatCharacter 'w' = Just (\_ _ -> show . snd . sundayStartWeek)-    formatCharacter 'W' = Just (\_ opt -> (show2 (fromMaybe (Just '0') opt)) . fst . mondayStartWeek)+    formatCharacter 'a' = Just $ padString $ \locale -> snd . ((wDays locale) !!) . snd . sundayStartWeek+    formatCharacter 'A' = Just $ padString $ \locale -> fst . ((wDays locale) !!) . snd . sundayStartWeek+    formatCharacter 'U' = Just $ padNum True  2 '0' $ fst . sundayStartWeek+    formatCharacter 'w' = Just $ padNum True  1 '0' $ snd . sundayStartWeek+    formatCharacter 'W' = Just $ padNum True  2 '0' $ fst . mondayStartWeek      -- Default     formatCharacter _   = Nothing  instance FormatTime UTCTime where-    formatCharacter c = fmap (\f locale mpado t -> f locale mpado (utcToZonedTime utc t)) (formatCharacter c)+    formatCharacter c = fmap (\f locale mpado mwidth t -> f locale mpado mwidth (utcToZonedTime utc t)) (formatCharacter c)  instance FormatTime UniversalTime where-    formatCharacter c = fmap (\f locale mpado t -> f locale mpado (ut1ToLocalTime 0 t)) (formatCharacter c)+    formatCharacter c = fmap (\f locale mpado mwidth t -> f locale mpado mwidth (ut1ToLocalTime 0 t)) (formatCharacter c)
lib/Data/Time/Format/Locale.hs view
@@ -11,7 +11,7 @@     ) where -import Data.Time.LocalTime.TimeZone+import Data.Time.LocalTime.Internal.TimeZone   data TimeLocale = TimeLocale {
lib/Data/Time/Format/Parse.hs view
@@ -15,17 +15,18 @@     ) where  import Text.Read(readMaybe)+import Data.Time.Clock.Internal.UniversalTime import Data.Time.Clock.POSIX-import Data.Time.Clock.Scale-import Data.Time.Clock.UTC+import Data.Time.Clock.Internal.UTCTime import Data.Time.Calendar.Days import Data.Time.Calendar.Gregorian import Data.Time.Calendar.OrdinalDate import Data.Time.Calendar.WeekDate import Data.Time.Calendar.Private(clipValid)-import Data.Time.LocalTime.TimeZone-import Data.Time.LocalTime.TimeOfDay-import Data.Time.LocalTime.LocalTime+import Data.Time.LocalTime.Internal.TimeZone+import Data.Time.LocalTime.Internal.TimeOfDay+import Data.Time.LocalTime.Internal.LocalTime+import Data.Time.LocalTime.Internal.ZonedTime  #if !MIN_VERSION_base(4,8,0) import Control.Applicative ((<$>),(<*>))@@ -75,8 +76,8 @@  #if LANGUAGE_Rank2Types -- | Parses a time value given a format string.--- Supports the same %-codes as 'formatTime', including @%-@, @%_@ and @%0@ modifiers.--- Case is not significant.+-- Supports the same %-codes as 'formatTime', including @%-@, @%_@ and @%0@ modifiers, however padding widths are not supported.+-- Case is not significant in the input string. -- Some variations in the input are accepted: -- -- [@%z@] accepts any of @-HHMM@ or @-HH:MM@.
lib/Data/Time/LocalTime.hs view
@@ -1,11 +1,18 @@ module Data.Time.LocalTime (-    module Data.Time.LocalTime.TimeZone,-    module Data.Time.LocalTime.TimeOfDay,-    module Data.Time.LocalTime.LocalTime+    -- * Time zones+    TimeZone(..),timeZoneOffsetString,timeZoneOffsetString',minutesToTimeZone,hoursToTimeZone,utc,++    -- getting the locale time zone+    getTimeZone,getCurrentTimeZone,++    module Data.Time.LocalTime.Internal.TimeOfDay,+    module Data.Time.LocalTime.Internal.LocalTime,+    module Data.Time.LocalTime.Internal.ZonedTime, ) where  import Data.Time.Format()-import Data.Time.LocalTime.TimeZone-import Data.Time.LocalTime.TimeOfDay-import Data.Time.LocalTime.LocalTime+import Data.Time.LocalTime.Internal.TimeZone hiding (timeZoneOffsetString'')+import Data.Time.LocalTime.Internal.TimeOfDay+import Data.Time.LocalTime.Internal.LocalTime+import Data.Time.LocalTime.Internal.ZonedTime
+ lib/Data/Time/LocalTime/Internal/LocalTime.hs view
@@ -0,0 +1,75 @@+{-# OPTIONS -fno-warn-orphans #-}+#include "HsConfigure.h"++-- #hide+module Data.Time.LocalTime.Internal.LocalTime+(+    -- * Local Time+    LocalTime(..),++    -- converting UTC and UT1 times to LocalTime+    utcToLocalTime,localTimeToUTC,ut1ToLocalTime,localTimeToUT1,+) where++++import Control.DeepSeq+import Data.Typeable+#if LANGUAGE_Rank2Types+import Data.Data+#endif+import Data.Time.Calendar.Days+import Data.Time.Calendar.Gregorian+import Data.Time.Clock.Internal.UniversalTime+import Data.Time.Clock.Internal.UTCTime+import Data.Time.LocalTime.Internal.TimeOfDay+import Data.Time.LocalTime.Internal.TimeZone+++-- | A simple day and time aggregate, where the day is of the specified parameter,+-- and the time is a TimeOfDay.+-- Conversion of this (as local civil time) to UTC depends on the time zone.+-- Conversion of this (as local mean time) to UT1 depends on the longitude.+data LocalTime = LocalTime {+    localDay    :: Day,+    localTimeOfDay   :: TimeOfDay+} deriving (Eq,Ord+#if LANGUAGE_DeriveDataTypeable+#if LANGUAGE_Rank2Types+#if HAS_DataPico+    ,Data, Typeable+#endif+#endif+#endif+    )++instance NFData LocalTime where+    rnf (LocalTime d t) = rnf d `seq` rnf t `seq` ()++instance Show LocalTime where+    show (LocalTime d t) = (showGregorian d) ++ " " ++ (show t)++-- | Get the local time of a UTC time in a time zone.+utcToLocalTime :: TimeZone -> UTCTime -> LocalTime+utcToLocalTime tz (UTCTime day dt) = LocalTime (addDays i day) tod where+    (i,tod) = utcToLocalTimeOfDay tz (timeToTimeOfDay dt)++-- | Get the UTC time of a local time in a time zone.+localTimeToUTC :: TimeZone -> LocalTime -> UTCTime+localTimeToUTC tz (LocalTime day tod) = UTCTime (addDays i day) (timeOfDayToTime todUTC) where+    (i,todUTC) = localToUTCTimeOfDay tz tod++-- | Get the local time of a UT1 time on a particular meridian (in degrees, positive is East).+ut1ToLocalTime :: Rational -> UniversalTime -> LocalTime+ut1ToLocalTime long (ModJulianDate date) = LocalTime (ModifiedJulianDay localMJD) (dayFractionToTimeOfDay localToDOffset) where+    localTime = date + long / 360 :: Rational+    localMJD = floor localTime+    localToDOffset = localTime - (fromIntegral localMJD)++-- | Get the UT1 time of a local time on a particular meridian (in degrees, positive is East).+localTimeToUT1 :: Rational -> LocalTime -> UniversalTime+localTimeToUT1 long (LocalTime (ModifiedJulianDay localMJD) tod) = ModJulianDate ((fromIntegral localMJD) + (timeOfDayToDayFraction tod) - (long / 360))++-- orphan instance+instance Show UniversalTime where+    show t = show (ut1ToLocalTime 0 t)
+ lib/Data/Time/LocalTime/Internal/TimeOfDay.hs view
@@ -0,0 +1,98 @@+{-# OPTIONS -fno-warn-unused-imports #-}+#include "HsConfigure.h"+-- #hide+module Data.Time.LocalTime.Internal.TimeOfDay+(+    -- * Time of day+    TimeOfDay(..),midnight,midday,makeTimeOfDayValid,+    utcToLocalTimeOfDay,localToUTCTimeOfDay,+    timeToTimeOfDay,timeOfDayToTime,+    dayFractionToTimeOfDay,timeOfDayToDayFraction+) where++import Control.DeepSeq+import Data.Typeable+import Data.Fixed+#if LANGUAGE_Rank2Types+import Data.Data+#endif+import Data.Time.Clock.Internal.DiffTime+import Data.Time.Calendar.Private+import Data.Time.LocalTime.Internal.TimeZone+++-- | Time of day as represented in hour, minute and second (with picoseconds), typically used to express local time of day.+data TimeOfDay = TimeOfDay {+    -- | range 0 - 23+    todHour    :: Int,+    -- | range 0 - 59+    todMin     :: Int,+    -- | Note that 0 <= 'todSec' < 61, accomodating leap seconds.+    -- Any local minute may have a leap second, since leap seconds happen in all zones simultaneously+    todSec     :: Pico+} deriving (Eq,Ord+#if LANGUAGE_DeriveDataTypeable+#if LANGUAGE_Rank2Types+#if HAS_DataPico+    ,Data, Typeable+#endif+#endif+#endif+    )++instance NFData TimeOfDay where+    rnf (TimeOfDay h m s) = rnf h `seq` rnf m `seq` s `seq` () -- FIXME: Data.Fixed had no NFData instances yet at time of writing++-- | Hour zero+midnight :: TimeOfDay+midnight = TimeOfDay 0 0 0++-- | Hour twelve+midday :: TimeOfDay+midday = TimeOfDay 12 0 0++instance Show TimeOfDay where+    show (TimeOfDay h m s) = (show2 h) ++ ":" ++ (show2 m) ++ ":" ++ (show2Fixed s)++makeTimeOfDayValid :: Int -> Int -> Pico -> Maybe TimeOfDay+makeTimeOfDayValid h m s = do+    _ <- clipValid 0 23 h+    _ <- clipValid 0 59 m+    _ <- clipValid 0 60.999999999999 s+    return (TimeOfDay h m s)++-- | Convert a time of day in UTC to a time of day in some timezone, together with a day adjustment.+utcToLocalTimeOfDay :: TimeZone -> TimeOfDay -> (Integer,TimeOfDay)+utcToLocalTimeOfDay zone (TimeOfDay h m s) = (fromIntegral (div h' 24),TimeOfDay (mod h' 24) (mod m' 60) s) where+    m' = m + timeZoneMinutes zone+    h' = h + (div m' 60)++-- | Convert a time of day in some timezone to a time of day in UTC, together with a day adjustment.+localToUTCTimeOfDay :: TimeZone -> TimeOfDay -> (Integer,TimeOfDay)+localToUTCTimeOfDay zone = utcToLocalTimeOfDay (minutesToTimeZone (negate (timeZoneMinutes zone)))++posixDayLength :: DiffTime+posixDayLength = fromInteger 86400++-- | Get the time of day given a time since midnight.+-- Time more than 24h will be converted to leap-seconds.+timeToTimeOfDay :: DiffTime -> TimeOfDay+timeToTimeOfDay dt | dt >= posixDayLength = TimeOfDay 23 59 (60 + (realToFrac (dt - posixDayLength)))+timeToTimeOfDay dt = TimeOfDay (fromInteger h) (fromInteger m) s where+    s' = realToFrac dt+    s = mod' s' 60+    m' = div' s' 60+    m = mod' m' 60+    h = div' m' 60++-- | Get the time since midnight for a given time of day.+timeOfDayToTime :: TimeOfDay -> DiffTime+timeOfDayToTime (TimeOfDay h m s) = ((fromIntegral h) * 60 + (fromIntegral m)) * 60 + (realToFrac s)++-- | Get the time of day given the fraction of a day since midnight.+dayFractionToTimeOfDay :: Rational -> TimeOfDay+dayFractionToTimeOfDay df = timeToTimeOfDay (realToFrac (df * 86400))++-- | Get the fraction of a day since midnight given a time of day.+timeOfDayToDayFraction :: TimeOfDay -> Rational+timeOfDayToDayFraction tod = realToFrac (timeOfDayToTime tod) / realToFrac posixDayLength
+ lib/Data/Time/LocalTime/Internal/TimeZone.hs view
@@ -0,0 +1,109 @@+{-# OPTIONS -fno-warn-unused-imports #-}+{-# LANGUAGE ForeignFunctionInterface #-}+#include "HsConfigure.h"++-- #hide+module Data.Time.LocalTime.Internal.TimeZone+(+    -- * Time zones+    TimeZone(..),timeZoneOffsetString,timeZoneOffsetString',timeZoneOffsetString'',minutesToTimeZone,hoursToTimeZone,utc,++    -- getting the locale time zone+    getTimeZone,getCurrentTimeZone+) where++--import System.Time.Calendar.Format+import Data.Time.Calendar.Private+import Data.Time.Clock.System+import Data.Time.Clock.POSIX+import Data.Time.Clock.Internal.UTCTime++#if __GLASGOW_HASKELL__ >= 709 || __GLASGOW_HASKELL__ < 702+import Foreign+#else+import Foreign.Safe+#endif+import Foreign.C+import Control.DeepSeq+import Data.Typeable+#if LANGUAGE_Rank2Types+import Data.Data+#endif++-- | A TimeZone is a whole number of minutes offset from UTC, together with a name and a \"just for summer\" flag.+data TimeZone = TimeZone {+    -- | The number of minutes offset from UTC. Positive means local time will be later in the day than UTC.+    timeZoneMinutes :: Int,+    -- | Is this time zone just persisting for the summer?+    timeZoneSummerOnly :: Bool,+    -- | The name of the zone, typically a three- or four-letter acronym.+    timeZoneName :: String+} deriving (Eq,Ord+#if LANGUAGE_DeriveDataTypeable+#if LANGUAGE_Rank2Types+    ,Data, Typeable+#endif+#endif+    )++instance NFData TimeZone where+    rnf (TimeZone m so n) = rnf m `seq` rnf so `seq` rnf n `seq` ()++-- | Create a nameless non-summer timezone for this number of minutes.+minutesToTimeZone :: Int -> TimeZone+minutesToTimeZone m = TimeZone m False ""++-- | Create a nameless non-summer timezone for this number of hours.+hoursToTimeZone :: Int -> TimeZone+hoursToTimeZone i = minutesToTimeZone (60 * i)++showT :: PadOption -> Int -> String+showT opt t = showPaddedNum opt ((div t 60) * 100 + (mod t 60))++timeZoneOffsetString'' :: PadOption -> TimeZone -> String+timeZoneOffsetString'' opt (TimeZone t _ _) | t < 0 = '-':(showT opt (negate t))+timeZoneOffsetString'' opt (TimeZone t _ _) = '+':(showT opt t)++-- | Text representing the offset of this timezone, such as \"-0800\" or \"+0400\" (like @%z@ in formatTime), with arbitrary padding.+timeZoneOffsetString' :: Maybe Char -> TimeZone -> String+timeZoneOffsetString' Nothing = timeZoneOffsetString'' NoPad+timeZoneOffsetString' (Just c) = timeZoneOffsetString'' $ Pad 4 c++-- | Text representing the offset of this timezone, such as \"-0800\" or \"+0400\" (like @%z@ in formatTime).+timeZoneOffsetString :: TimeZone -> String+timeZoneOffsetString = timeZoneOffsetString'' (Pad 4 '0')++instance Show TimeZone where+    show zone@(TimeZone _ _ "") = timeZoneOffsetString zone+    show (TimeZone _ _ name) = name++-- | The UTC time zone.+utc :: TimeZone+utc = TimeZone 0 False "UTC"++{-# CFILES cbits/HsTime.c #-}+foreign import ccall unsafe "HsTime.h get_current_timezone_seconds" get_current_timezone_seconds :: CTime -> Ptr CInt -> Ptr CString -> IO CLong++getTimeZoneCTime :: CTime -> IO TimeZone+getTimeZoneCTime ctime = with 0 (\pdst -> with nullPtr (\pcname -> do+    secs <- get_current_timezone_seconds ctime pdst pcname+    case secs of+        0x80000000 -> fail "localtime_r failed"+        _ -> do+            dst <- peek pdst+            cname <- peek pcname+            name <- peekCString cname+            return (TimeZone (div (fromIntegral secs) 60) (dst == 1) name)+    ))++-- | Get the local time-zone for a given time (varying as per summertime adjustments).+getTimeZoneSystem :: SystemTime -> IO TimeZone+getTimeZoneSystem = getTimeZoneCTime . CTime . systemSeconds++-- | Get the local time-zone for a given time (varying as per summertime adjustments).+getTimeZone :: UTCTime -> IO TimeZone+getTimeZone = getTimeZoneCTime . fromInteger . floor . utcTimeToPOSIXSeconds++-- | Get the current time-zone.+getCurrentTimeZone :: IO TimeZone+getCurrentTimeZone = getSystemTime >>= getTimeZoneSystem
+ lib/Data/Time/LocalTime/Internal/ZonedTime.hs view
@@ -0,0 +1,61 @@+{-# OPTIONS -fno-warn-orphans #-}+#include "HsConfigure.h"++-- #hide+module Data.Time.LocalTime.Internal.ZonedTime+(+    ZonedTime(..),utcToZonedTime,zonedTimeToUTC,getZonedTime,utcToLocalZonedTime+) where++import Control.DeepSeq+import Data.Typeable+#if LANGUAGE_Rank2Types+import Data.Data+#endif++import Data.Time.Clock.Internal.UTCTime+import Data.Time.Clock.POSIX+import Data.Time.LocalTime.Internal.TimeZone+import Data.Time.LocalTime.Internal.LocalTime+++-- | A local time together with a time zone.+data ZonedTime = ZonedTime {+    zonedTimeToLocalTime :: LocalTime,+    zonedTimeZone :: TimeZone+}+#if LANGUAGE_DeriveDataTypeable+#if LANGUAGE_Rank2Types+#if HAS_DataPico+    deriving (Data, Typeable)+#endif+#endif+#endif++instance NFData ZonedTime where+    rnf (ZonedTime lt z) = rnf lt `seq` rnf z `seq` ()++utcToZonedTime :: TimeZone -> UTCTime -> ZonedTime+utcToZonedTime zone time = ZonedTime (utcToLocalTime zone time) zone++zonedTimeToUTC :: ZonedTime -> UTCTime+zonedTimeToUTC (ZonedTime t zone) = localTimeToUTC zone t++instance Show ZonedTime where+    show (ZonedTime t zone) = show t ++ " " ++ show zone++-- orphan instance+instance Show UTCTime where+    show t = show (utcToZonedTime utc t)++getZonedTime :: IO ZonedTime+getZonedTime = do+    t <- getCurrentTime+    zone <- getTimeZone t+    return (utcToZonedTime zone t)++-- |+utcToLocalZonedTime :: UTCTime -> IO ZonedTime+utcToLocalZonedTime t = do+    zone <- getTimeZone t+    return (utcToZonedTime zone t)
− lib/Data/Time/LocalTime/LocalTime.hs
@@ -1,119 +0,0 @@-{-# OPTIONS -fno-warn-orphans -fno-warn-unused-imports #-}-#include "HsConfigure.h"---- #hide-module Data.Time.LocalTime.LocalTime-(-    -- * Local Time-    LocalTime(..),--    -- converting UTC and UT1 times to LocalTime-    utcToLocalTime,localTimeToUTC,ut1ToLocalTime,localTimeToUT1,--    ZonedTime(..),utcToZonedTime,zonedTimeToUTC,getZonedTime,utcToLocalZonedTime-) where--import Data.Time.LocalTime.TimeOfDay-import Data.Time.LocalTime.TimeZone-import Data.Time.Calendar.Days-import Data.Time.Calendar.Gregorian--import Data.Time.Clock.Scale-import Data.Time.Clock.UTCDiff-import Data.Time.Clock.UTC-import Data.Time.Clock.POSIX--import Control.DeepSeq-import Data.Typeable-#if LANGUAGE_Rank2Types-import Data.Data-#endif---- | A simple day and time aggregate, where the day is of the specified parameter,--- and the time is a TimeOfDay.--- Conversion of this (as local civil time) to UTC depends on the time zone.--- Conversion of this (as local mean time) to UT1 depends on the longitude.-data LocalTime = LocalTime {-    localDay    :: Day,-    localTimeOfDay   :: TimeOfDay-} deriving (Eq,Ord-#if LANGUAGE_DeriveDataTypeable-#if LANGUAGE_Rank2Types-#if HAS_DataPico-    ,Data, Typeable-#endif-#endif-#endif-    )--instance NFData LocalTime where-    rnf (LocalTime d t) = d `deepseq` t `deepseq` ()--instance Show LocalTime where-    show (LocalTime d t) = (showGregorian d) ++ " " ++ (show t)---- | show a UTC time in a given time zone as a LocalTime-utcToLocalTime :: TimeZone -> UTCTime -> LocalTime-utcToLocalTime tz (UTCTime day dt) = LocalTime (addDays i day) tod where-    (i,tod) = utcToLocalTimeOfDay tz (timeToTimeOfDay dt)---- | find out what UTC time a given LocalTime in a given time zone is-localTimeToUTC :: TimeZone -> LocalTime -> UTCTime-localTimeToUTC tz (LocalTime day tod) = UTCTime (addDays i day) (timeOfDayToTime todUTC) where-    (i,todUTC) = localToUTCTimeOfDay tz tod---- | 1st arg is observation meridian in degrees, positive is East-ut1ToLocalTime :: Rational -> UniversalTime -> LocalTime-ut1ToLocalTime long (ModJulianDate date) = LocalTime (ModifiedJulianDay localMJD) (dayFractionToTimeOfDay localToDOffset) where-    localTime = date + long / 360 :: Rational-    localMJD = floor localTime-    localToDOffset = localTime - (fromIntegral localMJD)---- | 1st arg is observation meridian in degrees, positive is East-localTimeToUT1 :: Rational -> LocalTime -> UniversalTime-localTimeToUT1 long (LocalTime (ModifiedJulianDay localMJD) tod) = ModJulianDate ((fromIntegral localMJD) + (timeOfDayToDayFraction tod) - (long / 360))---- orphan instance-instance Show UniversalTime where-    show t = show (ut1ToLocalTime 0 t)---- | A local time together with a TimeZone.-data ZonedTime = ZonedTime {-    zonedTimeToLocalTime :: LocalTime,-    zonedTimeZone :: TimeZone-}-#if LANGUAGE_DeriveDataTypeable-#if LANGUAGE_Rank2Types-#if HAS_DataPico-    deriving (Data, Typeable)-#endif-#endif-#endif--instance NFData ZonedTime where-    rnf (ZonedTime lt z) = lt `deepseq` z `deepseq` ()--utcToZonedTime :: TimeZone -> UTCTime -> ZonedTime-utcToZonedTime zone time = ZonedTime (utcToLocalTime zone time) zone--zonedTimeToUTC :: ZonedTime -> UTCTime-zonedTimeToUTC (ZonedTime t zone) = localTimeToUTC zone t--instance Show ZonedTime where-    show (ZonedTime t zone) = show t ++ " " ++ show zone---- orphan instance-instance Show UTCTime where-    show t = show (utcToZonedTime utc t)--getZonedTime :: IO ZonedTime-getZonedTime = do-    t <- getCurrentTime-    zone <- getTimeZone t-    return (utcToZonedTime zone t)---- |-utcToLocalZonedTime :: UTCTime -> IO ZonedTime-utcToLocalZonedTime t = do-    zone <- getTimeZone t-    return (utcToZonedTime zone t)
− lib/Data/Time/LocalTime/TimeOfDay.hs
@@ -1,97 +0,0 @@-{-# OPTIONS -fno-warn-unused-imports #-}-#include "HsConfigure.h"--- #hide-module Data.Time.LocalTime.TimeOfDay-(-    -- * Time of day-    TimeOfDay(..),midnight,midday,makeTimeOfDayValid,-    utcToLocalTimeOfDay,localToUTCTimeOfDay,-    timeToTimeOfDay,timeOfDayToTime,-    dayFractionToTimeOfDay,timeOfDayToDayFraction-) where--import Data.Time.LocalTime.TimeZone-import Data.Time.Calendar.Private-import Data.Time.Clock.Scale-import Control.DeepSeq-import Data.Typeable-import Data.Fixed-#if LANGUAGE_Rank2Types-import Data.Data-#endif---- | Time of day as represented in hour, minute and second (with picoseconds), typically used to express local time of day.-data TimeOfDay = TimeOfDay {-    -- | range 0 - 23-    todHour    :: Int,-    -- | range 0 - 59-    todMin     :: Int,-    -- | Note that 0 <= todSec < 61, accomodating leap seconds.-    -- Any local minute may have a leap second, since leap seconds happen in all zones simultaneously-    todSec     :: Pico-} deriving (Eq,Ord-#if LANGUAGE_DeriveDataTypeable-#if LANGUAGE_Rank2Types-#if HAS_DataPico-    ,Data, Typeable-#endif-#endif-#endif-    )--instance NFData TimeOfDay where-    rnf (TimeOfDay h m s) = h `deepseq` m `deepseq` s `seq` () -- FIXME: Data.Fixed had no NFData instances yet at time of writing---- | Hour zero-midnight :: TimeOfDay-midnight = TimeOfDay 0 0 0---- | Hour twelve-midday :: TimeOfDay-midday = TimeOfDay 12 0 0--instance Show TimeOfDay where-    show (TimeOfDay h m s) = (show2 (Just '0') h) ++ ":" ++ (show2 (Just '0') m) ++ ":" ++ (show2Fixed (Just '0') s)--makeTimeOfDayValid :: Int -> Int -> Pico -> Maybe TimeOfDay-makeTimeOfDayValid h m s = do-    _ <- clipValid 0 23 h-    _ <- clipValid 0 59 m-    _ <- clipValid 0 60.999999999999 s-    return (TimeOfDay h m s)---- | Convert a ToD in UTC to a ToD in some timezone, together with a day adjustment.-utcToLocalTimeOfDay :: TimeZone -> TimeOfDay -> (Integer,TimeOfDay)-utcToLocalTimeOfDay zone (TimeOfDay h m s) = (fromIntegral (div h' 24),TimeOfDay (mod h' 24) (mod m' 60) s) where-    m' = m + timeZoneMinutes zone-    h' = h + (div m' 60)---- | Convert a ToD in some timezone to a ToD in UTC, together with a day adjustment.-localToUTCTimeOfDay :: TimeZone -> TimeOfDay -> (Integer,TimeOfDay)-localToUTCTimeOfDay zone = utcToLocalTimeOfDay (minutesToTimeZone (negate (timeZoneMinutes zone)))--posixDayLength :: DiffTime-posixDayLength = fromInteger 86400---- | Get a TimeOfDay given a time since midnight.--- Time more than 24h will be converted to leap-seconds.-timeToTimeOfDay :: DiffTime -> TimeOfDay-timeToTimeOfDay dt | dt >= posixDayLength = TimeOfDay 23 59 (60 + (realToFrac (dt - posixDayLength)))-timeToTimeOfDay dt = TimeOfDay (fromInteger h) (fromInteger m) s where-    s' = realToFrac dt-    s = mod' s' 60-    m' = div' s' 60-    m = mod' m' 60-    h = div' m' 60---- | Find out how much time since midnight a given TimeOfDay is.-timeOfDayToTime :: TimeOfDay -> DiffTime-timeOfDayToTime (TimeOfDay h m s) = ((fromIntegral h) * 60 + (fromIntegral m)) * 60 + (realToFrac s)---- | Get a TimeOfDay given the fraction of a day since midnight.-dayFractionToTimeOfDay :: Rational -> TimeOfDay-dayFractionToTimeOfDay df = timeToTimeOfDay (realToFrac (df * 86400))---- | Get the fraction of a day since midnight given a TimeOfDay.-timeOfDayToDayFraction :: TimeOfDay -> Rational-timeOfDayToDayFraction tod = realToFrac (timeOfDayToTime tod) / realToFrac posixDayLength
− lib/Data/Time/LocalTime/TimeZone.hs
@@ -1,100 +0,0 @@-{-# OPTIONS -fno-warn-unused-imports #-}-{-# LANGUAGE ForeignFunctionInterface #-}-#include "HsConfigure.h"---- #hide-module Data.Time.LocalTime.TimeZone-(-    -- * Time zones-    TimeZone(..),timeZoneOffsetString,timeZoneOffsetString',minutesToTimeZone,hoursToTimeZone,utc,--    -- getting the locale time zone-    getTimeZone,getCurrentTimeZone-) where----import System.Time.Calendar.Format-import Data.Time.Calendar.Private-import Data.Time.Clock.POSIX-import Data.Time.Clock.UTC--#if __GLASGOW_HASKELL__ >= 709 || __GLASGOW_HASKELL__ < 702-import Foreign-#else-import Foreign.Safe-#endif-import Foreign.C-import Control.DeepSeq-import Data.Typeable-#if LANGUAGE_Rank2Types-import Data.Data-#endif---- | A TimeZone is a whole number of minutes offset from UTC, together with a name and a \"just for summer\" flag.-data TimeZone = TimeZone {-    -- | The number of minutes offset from UTC. Positive means local time will be later in the day than UTC.-    timeZoneMinutes :: Int,-    -- | Is this time zone just persisting for the summer?-    timeZoneSummerOnly :: Bool,-    -- | The name of the zone, typically a three- or four-letter acronym.-    timeZoneName :: String-} deriving (Eq,Ord-#if LANGUAGE_DeriveDataTypeable-#if LANGUAGE_Rank2Types-    ,Data, Typeable-#endif-#endif-    )--instance NFData TimeZone where-    rnf (TimeZone m so n) = m `deepseq` so `deepseq` n `deepseq` ()---- | Create a nameless non-summer timezone for this number of minutes-minutesToTimeZone :: Int -> TimeZone-minutesToTimeZone m = TimeZone m False ""---- | Create a nameless non-summer timezone for this number of hours-hoursToTimeZone :: Int -> TimeZone-hoursToTimeZone i = minutesToTimeZone (60 * i)--showT :: NumericPadOption -> Int -> String-showT opt t = show4 opt ((div t 60) * 100 + (mod t 60))---- | Text representing the offset of this timezone, such as \"-0800\" or \"+0400\" (like %z in formatTime), with arbitrary padding-timeZoneOffsetString' :: NumericPadOption -> TimeZone -> String-timeZoneOffsetString' opt (TimeZone t _ _) | t < 0 = '-':(showT opt (negate t))-timeZoneOffsetString' opt (TimeZone t _ _) = '+':(showT opt t)---- | Text representing the offset of this timezone, such as \"-0800\" or \"+0400\" (like %z in formatTime)-timeZoneOffsetString :: TimeZone -> String-timeZoneOffsetString = timeZoneOffsetString' (Just '0')--instance Show TimeZone where-    show zone@(TimeZone _ _ "") = timeZoneOffsetString zone-    show (TimeZone _ _ name) = name---- | The UTC time zone-utc :: TimeZone-utc = TimeZone 0 False "UTC"--{-# CFILES cbits/HsTime.c #-}-foreign import ccall unsafe "HsTime.h get_current_timezone_seconds" get_current_timezone_seconds :: CTime -> Ptr CInt -> Ptr CString -> IO CLong--posixToCTime :: POSIXTime -> CTime-posixToCTime  = fromInteger . floor---- | Get the local time-zone for a given time (varying as per summertime adjustments)-getTimeZone :: UTCTime -> IO TimeZone-getTimeZone time = with 0 (\pdst -> with nullPtr (\pcname -> do-    secs <- get_current_timezone_seconds (posixToCTime (utcTimeToPOSIXSeconds time)) pdst pcname-    case secs of-        0x80000000 -> fail "localtime_r failed"-        _ -> do-            dst <- peek pdst-            cname <- peek pcname-            name <- peekCString cname-            return (TimeZone (div (fromIntegral secs) 60) (dst == 1) name)-    ))---- | Get the current time-zone-getCurrentTimeZone :: IO TimeZone-getCurrentTimeZone = getCurrentTime >>= getTimeZone
− test/Test.hs
@@ -1,11 +0,0 @@-module Main where-import Test.Framework-import Test.Tests-import Foreign.C.Types--main :: IO ()-main = do-  if (toRational (1000000000000 :: CTime)) /= (1000000000000 :: Rational)-    then putStrLn "WARNING: Some tests will incorrectly fail due to a 32-bit time_t C type."-    else return ()-  defaultMain tests
− test/Test/AddDays.hs
@@ -1,41 +0,0 @@-module Test.AddDays where--import Data.Time.Calendar-import Test.TestUtil-import Test.AddDaysRef--days ::[Day]-days =-    [-    fromGregorian 2005 2 28,-    fromGregorian 2004 2 29,-    fromGregorian 2004 1 31,-    fromGregorian 2004 12 31,-    fromGregorian 2005 7 1,-    fromGregorian 2005 4 21,-    fromGregorian 2005 6 30-    ]--increments :: [Integer]-increments = [-10,-4,-1,0,1,7,83]--adders :: [(String,Integer -> Day -> Day)]-adders =-    [-    ("day",addDays),-    ("month (clip)",addGregorianMonthsClip),-    ("month (roll over)",addGregorianMonthsRollOver),-    ("year (clip)",addGregorianYearsClip),-    ("year (roll over)",addGregorianYearsRollOver)-    ]--resultDays :: [String]-resultDays = do-    (aname,adder) <- adders-    increment <- increments-    day <- days-    return ((showGregorian day) ++ " + " ++ (show increment) ++ " * " ++ aname ++ " = " ++ showGregorian (adder increment day))--addDaysTest :: Test-addDaysTest = pureTest "addDays" $-    diff addDaysRef $ unlines resultDays
− test/Test/AddDaysRef.hs
@@ -1,250 +0,0 @@-module Test.AddDaysRef where--addDaysRef :: String-addDaysRef =- unlines-  [ "2005-02-28 + -10 * day = 2005-02-18"-  , "2004-02-29 + -10 * day = 2004-02-19"-  , "2004-01-31 + -10 * day = 2004-01-21"-  , "2004-12-31 + -10 * day = 2004-12-21"-  , "2005-07-01 + -10 * day = 2005-06-21"-  , "2005-04-21 + -10 * day = 2005-04-11"-  , "2005-06-30 + -10 * day = 2005-06-20"-  , "2005-02-28 + -4 * day = 2005-02-24"-  , "2004-02-29 + -4 * day = 2004-02-25"-  , "2004-01-31 + -4 * day = 2004-01-27"-  , "2004-12-31 + -4 * day = 2004-12-27"-  , "2005-07-01 + -4 * day = 2005-06-27"-  , "2005-04-21 + -4 * day = 2005-04-17"-  , "2005-06-30 + -4 * day = 2005-06-26"-  , "2005-02-28 + -1 * day = 2005-02-27"-  , "2004-02-29 + -1 * day = 2004-02-28"-  , "2004-01-31 + -1 * day = 2004-01-30"-  , "2004-12-31 + -1 * day = 2004-12-30"-  , "2005-07-01 + -1 * day = 2005-06-30"-  , "2005-04-21 + -1 * day = 2005-04-20"-  , "2005-06-30 + -1 * day = 2005-06-29"-  , "2005-02-28 + 0 * day = 2005-02-28"-  , "2004-02-29 + 0 * day = 2004-02-29"-  , "2004-01-31 + 0 * day = 2004-01-31"-  , "2004-12-31 + 0 * day = 2004-12-31"-  , "2005-07-01 + 0 * day = 2005-07-01"-  , "2005-04-21 + 0 * day = 2005-04-21"-  , "2005-06-30 + 0 * day = 2005-06-30"-  , "2005-02-28 + 1 * day = 2005-03-01"-  , "2004-02-29 + 1 * day = 2004-03-01"-  , "2004-01-31 + 1 * day = 2004-02-01"-  , "2004-12-31 + 1 * day = 2005-01-01"-  , "2005-07-01 + 1 * day = 2005-07-02"-  , "2005-04-21 + 1 * day = 2005-04-22"-  , "2005-06-30 + 1 * day = 2005-07-01"-  , "2005-02-28 + 7 * day = 2005-03-07"-  , "2004-02-29 + 7 * day = 2004-03-07"-  , "2004-01-31 + 7 * day = 2004-02-07"-  , "2004-12-31 + 7 * day = 2005-01-07"-  , "2005-07-01 + 7 * day = 2005-07-08"-  , "2005-04-21 + 7 * day = 2005-04-28"-  , "2005-06-30 + 7 * day = 2005-07-07"-  , "2005-02-28 + 83 * day = 2005-05-22"-  , "2004-02-29 + 83 * day = 2004-05-22"-  , "2004-01-31 + 83 * day = 2004-04-23"-  , "2004-12-31 + 83 * day = 2005-03-24"-  , "2005-07-01 + 83 * day = 2005-09-22"-  , "2005-04-21 + 83 * day = 2005-07-13"-  , "2005-06-30 + 83 * day = 2005-09-21"-  , "2005-02-28 + -10 * month (clip) = 2004-04-28"-  , "2004-02-29 + -10 * month (clip) = 2003-04-29"-  , "2004-01-31 + -10 * month (clip) = 2003-03-31"-  , "2004-12-31 + -10 * month (clip) = 2004-02-29"-  , "2005-07-01 + -10 * month (clip) = 2004-09-01"-  , "2005-04-21 + -10 * month (clip) = 2004-06-21"-  , "2005-06-30 + -10 * month (clip) = 2004-08-30"-  , "2005-02-28 + -4 * month (clip) = 2004-10-28"-  , "2004-02-29 + -4 * month (clip) = 2003-10-29"-  , "2004-01-31 + -4 * month (clip) = 2003-09-30"-  , "2004-12-31 + -4 * month (clip) = 2004-08-31"-  , "2005-07-01 + -4 * month (clip) = 2005-03-01"-  , "2005-04-21 + -4 * month (clip) = 2004-12-21"-  , "2005-06-30 + -4 * month (clip) = 2005-02-28"-  , "2005-02-28 + -1 * month (clip) = 2005-01-28"-  , "2004-02-29 + -1 * month (clip) = 2004-01-29"-  , "2004-01-31 + -1 * month (clip) = 2003-12-31"-  , "2004-12-31 + -1 * month (clip) = 2004-11-30"-  , "2005-07-01 + -1 * month (clip) = 2005-06-01"-  , "2005-04-21 + -1 * month (clip) = 2005-03-21"-  , "2005-06-30 + -1 * month (clip) = 2005-05-30"-  , "2005-02-28 + 0 * month (clip) = 2005-02-28"-  , "2004-02-29 + 0 * month (clip) = 2004-02-29"-  , "2004-01-31 + 0 * month (clip) = 2004-01-31"-  , "2004-12-31 + 0 * month (clip) = 2004-12-31"-  , "2005-07-01 + 0 * month (clip) = 2005-07-01"-  , "2005-04-21 + 0 * month (clip) = 2005-04-21"-  , "2005-06-30 + 0 * month (clip) = 2005-06-30"-  , "2005-02-28 + 1 * month (clip) = 2005-03-28"-  , "2004-02-29 + 1 * month (clip) = 2004-03-29"-  , "2004-01-31 + 1 * month (clip) = 2004-02-29"-  , "2004-12-31 + 1 * month (clip) = 2005-01-31"-  , "2005-07-01 + 1 * month (clip) = 2005-08-01"-  , "2005-04-21 + 1 * month (clip) = 2005-05-21"-  , "2005-06-30 + 1 * month (clip) = 2005-07-30"-  , "2005-02-28 + 7 * month (clip) = 2005-09-28"-  , "2004-02-29 + 7 * month (clip) = 2004-09-29"-  , "2004-01-31 + 7 * month (clip) = 2004-08-31"-  , "2004-12-31 + 7 * month (clip) = 2005-07-31"-  , "2005-07-01 + 7 * month (clip) = 2006-02-01"-  , "2005-04-21 + 7 * month (clip) = 2005-11-21"-  , "2005-06-30 + 7 * month (clip) = 2006-01-30"-  , "2005-02-28 + 83 * month (clip) = 2012-01-28"-  , "2004-02-29 + 83 * month (clip) = 2011-01-29"-  , "2004-01-31 + 83 * month (clip) = 2010-12-31"-  , "2004-12-31 + 83 * month (clip) = 2011-11-30"-  , "2005-07-01 + 83 * month (clip) = 2012-06-01"-  , "2005-04-21 + 83 * month (clip) = 2012-03-21"-  , "2005-06-30 + 83 * month (clip) = 2012-05-30"-  , "2005-02-28 + -10 * month (roll over) = 2004-04-28"-  , "2004-02-29 + -10 * month (roll over) = 2003-04-29"-  , "2004-01-31 + -10 * month (roll over) = 2003-03-31"-  , "2004-12-31 + -10 * month (roll over) = 2004-03-02"-  , "2005-07-01 + -10 * month (roll over) = 2004-09-01"-  , "2005-04-21 + -10 * month (roll over) = 2004-06-21"-  , "2005-06-30 + -10 * month (roll over) = 2004-08-30"-  , "2005-02-28 + -4 * month (roll over) = 2004-10-28"-  , "2004-02-29 + -4 * month (roll over) = 2003-10-29"-  , "2004-01-31 + -4 * month (roll over) = 2003-10-01"-  , "2004-12-31 + -4 * month (roll over) = 2004-08-31"-  , "2005-07-01 + -4 * month (roll over) = 2005-03-01"-  , "2005-04-21 + -4 * month (roll over) = 2004-12-21"-  , "2005-06-30 + -4 * month (roll over) = 2005-03-02"-  , "2005-02-28 + -1 * month (roll over) = 2005-01-28"-  , "2004-02-29 + -1 * month (roll over) = 2004-01-29"-  , "2004-01-31 + -1 * month (roll over) = 2003-12-31"-  , "2004-12-31 + -1 * month (roll over) = 2004-12-01"-  , "2005-07-01 + -1 * month (roll over) = 2005-06-01"-  , "2005-04-21 + -1 * month (roll over) = 2005-03-21"-  , "2005-06-30 + -1 * month (roll over) = 2005-05-30"-  , "2005-02-28 + 0 * month (roll over) = 2005-02-28"-  , "2004-02-29 + 0 * month (roll over) = 2004-02-29"-  , "2004-01-31 + 0 * month (roll over) = 2004-01-31"-  , "2004-12-31 + 0 * month (roll over) = 2004-12-31"-  , "2005-07-01 + 0 * month (roll over) = 2005-07-01"-  , "2005-04-21 + 0 * month (roll over) = 2005-04-21"-  , "2005-06-30 + 0 * month (roll over) = 2005-06-30"-  , "2005-02-28 + 1 * month (roll over) = 2005-03-28"-  , "2004-02-29 + 1 * month (roll over) = 2004-03-29"-  , "2004-01-31 + 1 * month (roll over) = 2004-03-02"-  , "2004-12-31 + 1 * month (roll over) = 2005-01-31"-  , "2005-07-01 + 1 * month (roll over) = 2005-08-01"-  , "2005-04-21 + 1 * month (roll over) = 2005-05-21"-  , "2005-06-30 + 1 * month (roll over) = 2005-07-30"-  , "2005-02-28 + 7 * month (roll over) = 2005-09-28"-  , "2004-02-29 + 7 * month (roll over) = 2004-09-29"-  , "2004-01-31 + 7 * month (roll over) = 2004-08-31"-  , "2004-12-31 + 7 * month (roll over) = 2005-07-31"-  , "2005-07-01 + 7 * month (roll over) = 2006-02-01"-  , "2005-04-21 + 7 * month (roll over) = 2005-11-21"-  , "2005-06-30 + 7 * month (roll over) = 2006-01-30"-  , "2005-02-28 + 83 * month (roll over) = 2012-01-28"-  , "2004-02-29 + 83 * month (roll over) = 2011-01-29"-  , "2004-01-31 + 83 * month (roll over) = 2010-12-31"-  , "2004-12-31 + 83 * month (roll over) = 2011-12-01"-  , "2005-07-01 + 83 * month (roll over) = 2012-06-01"-  , "2005-04-21 + 83 * month (roll over) = 2012-03-21"-  , "2005-06-30 + 83 * month (roll over) = 2012-05-30"-  , "2005-02-28 + -10 * year (clip) = 1995-02-28"-  , "2004-02-29 + -10 * year (clip) = 1994-02-28"-  , "2004-01-31 + -10 * year (clip) = 1994-01-31"-  , "2004-12-31 + -10 * year (clip) = 1994-12-31"-  , "2005-07-01 + -10 * year (clip) = 1995-07-01"-  , "2005-04-21 + -10 * year (clip) = 1995-04-21"-  , "2005-06-30 + -10 * year (clip) = 1995-06-30"-  , "2005-02-28 + -4 * year (clip) = 2001-02-28"-  , "2004-02-29 + -4 * year (clip) = 2000-02-29"-  , "2004-01-31 + -4 * year (clip) = 2000-01-31"-  , "2004-12-31 + -4 * year (clip) = 2000-12-31"-  , "2005-07-01 + -4 * year (clip) = 2001-07-01"-  , "2005-04-21 + -4 * year (clip) = 2001-04-21"-  , "2005-06-30 + -4 * year (clip) = 2001-06-30"-  , "2005-02-28 + -1 * year (clip) = 2004-02-28"-  , "2004-02-29 + -1 * year (clip) = 2003-02-28"-  , "2004-01-31 + -1 * year (clip) = 2003-01-31"-  , "2004-12-31 + -1 * year (clip) = 2003-12-31"-  , "2005-07-01 + -1 * year (clip) = 2004-07-01"-  , "2005-04-21 + -1 * year (clip) = 2004-04-21"-  , "2005-06-30 + -1 * year (clip) = 2004-06-30"-  , "2005-02-28 + 0 * year (clip) = 2005-02-28"-  , "2004-02-29 + 0 * year (clip) = 2004-02-29"-  , "2004-01-31 + 0 * year (clip) = 2004-01-31"-  , "2004-12-31 + 0 * year (clip) = 2004-12-31"-  , "2005-07-01 + 0 * year (clip) = 2005-07-01"-  , "2005-04-21 + 0 * year (clip) = 2005-04-21"-  , "2005-06-30 + 0 * year (clip) = 2005-06-30"-  , "2005-02-28 + 1 * year (clip) = 2006-02-28"-  , "2004-02-29 + 1 * year (clip) = 2005-02-28"-  , "2004-01-31 + 1 * year (clip) = 2005-01-31"-  , "2004-12-31 + 1 * year (clip) = 2005-12-31"-  , "2005-07-01 + 1 * year (clip) = 2006-07-01"-  , "2005-04-21 + 1 * year (clip) = 2006-04-21"-  , "2005-06-30 + 1 * year (clip) = 2006-06-30"-  , "2005-02-28 + 7 * year (clip) = 2012-02-28"-  , "2004-02-29 + 7 * year (clip) = 2011-02-28"-  , "2004-01-31 + 7 * year (clip) = 2011-01-31"-  , "2004-12-31 + 7 * year (clip) = 2011-12-31"-  , "2005-07-01 + 7 * year (clip) = 2012-07-01"-  , "2005-04-21 + 7 * year (clip) = 2012-04-21"-  , "2005-06-30 + 7 * year (clip) = 2012-06-30"-  , "2005-02-28 + 83 * year (clip) = 2088-02-28"-  , "2004-02-29 + 83 * year (clip) = 2087-02-28"-  , "2004-01-31 + 83 * year (clip) = 2087-01-31"-  , "2004-12-31 + 83 * year (clip) = 2087-12-31"-  , "2005-07-01 + 83 * year (clip) = 2088-07-01"-  , "2005-04-21 + 83 * year (clip) = 2088-04-21"-  , "2005-06-30 + 83 * year (clip) = 2088-06-30"-  , "2005-02-28 + -10 * year (roll over) = 1995-02-28"-  , "2004-02-29 + -10 * year (roll over) = 1994-03-01"-  , "2004-01-31 + -10 * year (roll over) = 1994-01-31"-  , "2004-12-31 + -10 * year (roll over) = 1994-12-31"-  , "2005-07-01 + -10 * year (roll over) = 1995-07-01"-  , "2005-04-21 + -10 * year (roll over) = 1995-04-21"-  , "2005-06-30 + -10 * year (roll over) = 1995-06-30"-  , "2005-02-28 + -4 * year (roll over) = 2001-02-28"-  , "2004-02-29 + -4 * year (roll over) = 2000-02-29"-  , "2004-01-31 + -4 * year (roll over) = 2000-01-31"-  , "2004-12-31 + -4 * year (roll over) = 2000-12-31"-  , "2005-07-01 + -4 * year (roll over) = 2001-07-01"-  , "2005-04-21 + -4 * year (roll over) = 2001-04-21"-  , "2005-06-30 + -4 * year (roll over) = 2001-06-30"-  , "2005-02-28 + -1 * year (roll over) = 2004-02-28"-  , "2004-02-29 + -1 * year (roll over) = 2003-03-01"-  , "2004-01-31 + -1 * year (roll over) = 2003-01-31"-  , "2004-12-31 + -1 * year (roll over) = 2003-12-31"-  , "2005-07-01 + -1 * year (roll over) = 2004-07-01"-  , "2005-04-21 + -1 * year (roll over) = 2004-04-21"-  , "2005-06-30 + -1 * year (roll over) = 2004-06-30"-  , "2005-02-28 + 0 * year (roll over) = 2005-02-28"-  , "2004-02-29 + 0 * year (roll over) = 2004-02-29"-  , "2004-01-31 + 0 * year (roll over) = 2004-01-31"-  , "2004-12-31 + 0 * year (roll over) = 2004-12-31"-  , "2005-07-01 + 0 * year (roll over) = 2005-07-01"-  , "2005-04-21 + 0 * year (roll over) = 2005-04-21"-  , "2005-06-30 + 0 * year (roll over) = 2005-06-30"-  , "2005-02-28 + 1 * year (roll over) = 2006-02-28"-  , "2004-02-29 + 1 * year (roll over) = 2005-03-01"-  , "2004-01-31 + 1 * year (roll over) = 2005-01-31"-  , "2004-12-31 + 1 * year (roll over) = 2005-12-31"-  , "2005-07-01 + 1 * year (roll over) = 2006-07-01"-  , "2005-04-21 + 1 * year (roll over) = 2006-04-21"-  , "2005-06-30 + 1 * year (roll over) = 2006-06-30"-  , "2005-02-28 + 7 * year (roll over) = 2012-02-28"-  , "2004-02-29 + 7 * year (roll over) = 2011-03-01"-  , "2004-01-31 + 7 * year (roll over) = 2011-01-31"-  , "2004-12-31 + 7 * year (roll over) = 2011-12-31"-  , "2005-07-01 + 7 * year (roll over) = 2012-07-01"-  , "2005-04-21 + 7 * year (roll over) = 2012-04-21"-  , "2005-06-30 + 7 * year (roll over) = 2012-06-30"-  , "2005-02-28 + 83 * year (roll over) = 2088-02-28"-  , "2004-02-29 + 83 * year (roll over) = 2087-03-01"-  , "2004-01-31 + 83 * year (roll over) = 2087-01-31"-  , "2004-12-31 + 83 * year (roll over) = 2087-12-31"-  , "2005-07-01 + 83 * year (roll over) = 2088-07-01"-  , "2005-04-21 + 83 * year (roll over) = 2088-04-21"-  , "2005-06-30 + 83 * year (roll over) = 2088-06-30" ]
− test/Test/ClipDates.hs
@@ -1,46 +0,0 @@-{-# Language TupleSections #-}--module Test.ClipDates where--import Data.Time.Calendar.OrdinalDate-import Data.Time.Calendar.WeekDate-import Data.Time.Calendar-import Test.TestUtil-import Test.ClipDatesRef--yearAndDay :: (Integer,Int) -> String-yearAndDay (y,d) = (show y) ++ "-" ++ (show d) ++ " = " ++ (showOrdinalDate (fromOrdinalDate y d))--gregorian :: (Integer,Int,Int) -> String-gregorian (y,m,d) = (show y) ++ "-" ++ (show m) ++ "-" ++ (show d) ++ " = " ++ (showGregorian (fromGregorian y m d))--iSOWeekDay :: (Integer,Int,Int) -> String-iSOWeekDay (y,w,d) = (show y) ++ "-W" ++ (show w) ++ "-" ++ (show d) ++ " = " ++ (showWeekDate (fromWeekDate y w d))------tupleUp2 :: [a] -> [b] -> [(a, b)]-tupleUp2 l1 l2 = concatMap (\e -> map (e,) l2) l1--tupleUp3 :: [a] -> [b] -> [c] -> [(a, b, c)]-tupleUp3 l1 l2 l3-  = let ts = tupleUp2 l2 l3-    in concatMap (\e -> map (\(f, g) -> (e, f, g)) ts) l1------clipDates :: Test-clipDates = pureTest "clipDates" $-    let-        yad  = unlines $ map yearAndDay $-            tupleUp2 [1968,1969,1971] [-4,0,1,200,364,365,366,367,700]---        greg = unlines $ map gregorian $-            tupleUp3 [1968,1969,1971] [-20,-1,0,1,2,12,13,17] [-7,-1,0,1,2,27,28,29,30,31,32,40]--        iso  = unlines $ map iSOWeekDay $-            tupleUp3 [1968,1969,2004] [-20,-1,0,1,20,51,52,53,54] [-2,-1,0,1,4,6,7,8,9]--    in diff clipDatesRef $-        concat [ "YearAndDay\n", yad, "Gregorian\n", greg, "ISOWeekDay\n", iso ]
− test/Test/ClipDatesRef.hs
@@ -1,566 +0,0 @@-module Test.ClipDatesRef where--clipDatesRef :: String-clipDatesRef =- unlines-  [ "YearAndDay"-  , "1968--4 = 1968-001"-  , "1968-0 = 1968-001"-  , "1968-1 = 1968-001"-  , "1968-200 = 1968-200"-  , "1968-364 = 1968-364"-  , "1968-365 = 1968-365"-  , "1968-366 = 1968-366"-  , "1968-367 = 1968-366"-  , "1968-700 = 1968-366"-  , "1969--4 = 1969-001"-  , "1969-0 = 1969-001"-  , "1969-1 = 1969-001"-  , "1969-200 = 1969-200"-  , "1969-364 = 1969-364"-  , "1969-365 = 1969-365"-  , "1969-366 = 1969-365"-  , "1969-367 = 1969-365"-  , "1969-700 = 1969-365"-  , "1971--4 = 1971-001"-  , "1971-0 = 1971-001"-  , "1971-1 = 1971-001"-  , "1971-200 = 1971-200"-  , "1971-364 = 1971-364"-  , "1971-365 = 1971-365"-  , "1971-366 = 1971-365"-  , "1971-367 = 1971-365"-  , "1971-700 = 1971-365"-  , "Gregorian"-  , "1968--20--7 = 1968-01-01"-  , "1968--20--1 = 1968-01-01"-  , "1968--20-0 = 1968-01-01"-  , "1968--20-1 = 1968-01-01"-  , "1968--20-2 = 1968-01-02"-  , "1968--20-27 = 1968-01-27"-  , "1968--20-28 = 1968-01-28"-  , "1968--20-29 = 1968-01-29"-  , "1968--20-30 = 1968-01-30"-  , "1968--20-31 = 1968-01-31"-  , "1968--20-32 = 1968-01-31"-  , "1968--20-40 = 1968-01-31"-  , "1968--1--7 = 1968-01-01"-  , "1968--1--1 = 1968-01-01"-  , "1968--1-0 = 1968-01-01"-  , "1968--1-1 = 1968-01-01"-  , "1968--1-2 = 1968-01-02"-  , "1968--1-27 = 1968-01-27"-  , "1968--1-28 = 1968-01-28"-  , "1968--1-29 = 1968-01-29"-  , "1968--1-30 = 1968-01-30"-  , "1968--1-31 = 1968-01-31"-  , "1968--1-32 = 1968-01-31"-  , "1968--1-40 = 1968-01-31"-  , "1968-0--7 = 1968-01-01"-  , "1968-0--1 = 1968-01-01"-  , "1968-0-0 = 1968-01-01"-  , "1968-0-1 = 1968-01-01"-  , "1968-0-2 = 1968-01-02"-  , "1968-0-27 = 1968-01-27"-  , "1968-0-28 = 1968-01-28"-  , "1968-0-29 = 1968-01-29"-  , "1968-0-30 = 1968-01-30"-  , "1968-0-31 = 1968-01-31"-  , "1968-0-32 = 1968-01-31"-  , "1968-0-40 = 1968-01-31"-  , "1968-1--7 = 1968-01-01"-  , "1968-1--1 = 1968-01-01"-  , "1968-1-0 = 1968-01-01"-  , "1968-1-1 = 1968-01-01"-  , "1968-1-2 = 1968-01-02"-  , "1968-1-27 = 1968-01-27"-  , "1968-1-28 = 1968-01-28"-  , "1968-1-29 = 1968-01-29"-  , "1968-1-30 = 1968-01-30"-  , "1968-1-31 = 1968-01-31"-  , "1968-1-32 = 1968-01-31"-  , "1968-1-40 = 1968-01-31"-  , "1968-2--7 = 1968-02-01"-  , "1968-2--1 = 1968-02-01"-  , "1968-2-0 = 1968-02-01"-  , "1968-2-1 = 1968-02-01"-  , "1968-2-2 = 1968-02-02"-  , "1968-2-27 = 1968-02-27"-  , "1968-2-28 = 1968-02-28"-  , "1968-2-29 = 1968-02-29"-  , "1968-2-30 = 1968-02-29"-  , "1968-2-31 = 1968-02-29"-  , "1968-2-32 = 1968-02-29"-  , "1968-2-40 = 1968-02-29"-  , "1968-12--7 = 1968-12-01"-  , "1968-12--1 = 1968-12-01"-  , "1968-12-0 = 1968-12-01"-  , "1968-12-1 = 1968-12-01"-  , "1968-12-2 = 1968-12-02"-  , "1968-12-27 = 1968-12-27"-  , "1968-12-28 = 1968-12-28"-  , "1968-12-29 = 1968-12-29"-  , "1968-12-30 = 1968-12-30"-  , "1968-12-31 = 1968-12-31"-  , "1968-12-32 = 1968-12-31"-  , "1968-12-40 = 1968-12-31"-  , "1968-13--7 = 1968-12-01"-  , "1968-13--1 = 1968-12-01"-  , "1968-13-0 = 1968-12-01"-  , "1968-13-1 = 1968-12-01"-  , "1968-13-2 = 1968-12-02"-  , "1968-13-27 = 1968-12-27"-  , "1968-13-28 = 1968-12-28"-  , "1968-13-29 = 1968-12-29"-  , "1968-13-30 = 1968-12-30"-  , "1968-13-31 = 1968-12-31"-  , "1968-13-32 = 1968-12-31"-  , "1968-13-40 = 1968-12-31"-  , "1968-17--7 = 1968-12-01"-  , "1968-17--1 = 1968-12-01"-  , "1968-17-0 = 1968-12-01"-  , "1968-17-1 = 1968-12-01"-  , "1968-17-2 = 1968-12-02"-  , "1968-17-27 = 1968-12-27"-  , "1968-17-28 = 1968-12-28"-  , "1968-17-29 = 1968-12-29"-  , "1968-17-30 = 1968-12-30"-  , "1968-17-31 = 1968-12-31"-  , "1968-17-32 = 1968-12-31"-  , "1968-17-40 = 1968-12-31"-  , "1969--20--7 = 1969-01-01"-  , "1969--20--1 = 1969-01-01"-  , "1969--20-0 = 1969-01-01"-  , "1969--20-1 = 1969-01-01"-  , "1969--20-2 = 1969-01-02"-  , "1969--20-27 = 1969-01-27"-  , "1969--20-28 = 1969-01-28"-  , "1969--20-29 = 1969-01-29"-  , "1969--20-30 = 1969-01-30"-  , "1969--20-31 = 1969-01-31"-  , "1969--20-32 = 1969-01-31"-  , "1969--20-40 = 1969-01-31"-  , "1969--1--7 = 1969-01-01"-  , "1969--1--1 = 1969-01-01"-  , "1969--1-0 = 1969-01-01"-  , "1969--1-1 = 1969-01-01"-  , "1969--1-2 = 1969-01-02"-  , "1969--1-27 = 1969-01-27"-  , "1969--1-28 = 1969-01-28"-  , "1969--1-29 = 1969-01-29"-  , "1969--1-30 = 1969-01-30"-  , "1969--1-31 = 1969-01-31"-  , "1969--1-32 = 1969-01-31"-  , "1969--1-40 = 1969-01-31"-  , "1969-0--7 = 1969-01-01"-  , "1969-0--1 = 1969-01-01"-  , "1969-0-0 = 1969-01-01"-  , "1969-0-1 = 1969-01-01"-  , "1969-0-2 = 1969-01-02"-  , "1969-0-27 = 1969-01-27"-  , "1969-0-28 = 1969-01-28"-  , "1969-0-29 = 1969-01-29"-  , "1969-0-30 = 1969-01-30"-  , "1969-0-31 = 1969-01-31"-  , "1969-0-32 = 1969-01-31"-  , "1969-0-40 = 1969-01-31"-  , "1969-1--7 = 1969-01-01"-  , "1969-1--1 = 1969-01-01"-  , "1969-1-0 = 1969-01-01"-  , "1969-1-1 = 1969-01-01"-  , "1969-1-2 = 1969-01-02"-  , "1969-1-27 = 1969-01-27"-  , "1969-1-28 = 1969-01-28"-  , "1969-1-29 = 1969-01-29"-  , "1969-1-30 = 1969-01-30"-  , "1969-1-31 = 1969-01-31"-  , "1969-1-32 = 1969-01-31"-  , "1969-1-40 = 1969-01-31"-  , "1969-2--7 = 1969-02-01"-  , "1969-2--1 = 1969-02-01"-  , "1969-2-0 = 1969-02-01"-  , "1969-2-1 = 1969-02-01"-  , "1969-2-2 = 1969-02-02"-  , "1969-2-27 = 1969-02-27"-  , "1969-2-28 = 1969-02-28"-  , "1969-2-29 = 1969-02-28"-  , "1969-2-30 = 1969-02-28"-  , "1969-2-31 = 1969-02-28"-  , "1969-2-32 = 1969-02-28"-  , "1969-2-40 = 1969-02-28"-  , "1969-12--7 = 1969-12-01"-  , "1969-12--1 = 1969-12-01"-  , "1969-12-0 = 1969-12-01"-  , "1969-12-1 = 1969-12-01"-  , "1969-12-2 = 1969-12-02"-  , "1969-12-27 = 1969-12-27"-  , "1969-12-28 = 1969-12-28"-  , "1969-12-29 = 1969-12-29"-  , "1969-12-30 = 1969-12-30"-  , "1969-12-31 = 1969-12-31"-  , "1969-12-32 = 1969-12-31"-  , "1969-12-40 = 1969-12-31"-  , "1969-13--7 = 1969-12-01"-  , "1969-13--1 = 1969-12-01"-  , "1969-13-0 = 1969-12-01"-  , "1969-13-1 = 1969-12-01"-  , "1969-13-2 = 1969-12-02"-  , "1969-13-27 = 1969-12-27"-  , "1969-13-28 = 1969-12-28"-  , "1969-13-29 = 1969-12-29"-  , "1969-13-30 = 1969-12-30"-  , "1969-13-31 = 1969-12-31"-  , "1969-13-32 = 1969-12-31"-  , "1969-13-40 = 1969-12-31"-  , "1969-17--7 = 1969-12-01"-  , "1969-17--1 = 1969-12-01"-  , "1969-17-0 = 1969-12-01"-  , "1969-17-1 = 1969-12-01"-  , "1969-17-2 = 1969-12-02"-  , "1969-17-27 = 1969-12-27"-  , "1969-17-28 = 1969-12-28"-  , "1969-17-29 = 1969-12-29"-  , "1969-17-30 = 1969-12-30"-  , "1969-17-31 = 1969-12-31"-  , "1969-17-32 = 1969-12-31"-  , "1969-17-40 = 1969-12-31"-  , "1971--20--7 = 1971-01-01"-  , "1971--20--1 = 1971-01-01"-  , "1971--20-0 = 1971-01-01"-  , "1971--20-1 = 1971-01-01"-  , "1971--20-2 = 1971-01-02"-  , "1971--20-27 = 1971-01-27"-  , "1971--20-28 = 1971-01-28"-  , "1971--20-29 = 1971-01-29"-  , "1971--20-30 = 1971-01-30"-  , "1971--20-31 = 1971-01-31"-  , "1971--20-32 = 1971-01-31"-  , "1971--20-40 = 1971-01-31"-  , "1971--1--7 = 1971-01-01"-  , "1971--1--1 = 1971-01-01"-  , "1971--1-0 = 1971-01-01"-  , "1971--1-1 = 1971-01-01"-  , "1971--1-2 = 1971-01-02"-  , "1971--1-27 = 1971-01-27"-  , "1971--1-28 = 1971-01-28"-  , "1971--1-29 = 1971-01-29"-  , "1971--1-30 = 1971-01-30"-  , "1971--1-31 = 1971-01-31"-  , "1971--1-32 = 1971-01-31"-  , "1971--1-40 = 1971-01-31"-  , "1971-0--7 = 1971-01-01"-  , "1971-0--1 = 1971-01-01"-  , "1971-0-0 = 1971-01-01"-  , "1971-0-1 = 1971-01-01"-  , "1971-0-2 = 1971-01-02"-  , "1971-0-27 = 1971-01-27"-  , "1971-0-28 = 1971-01-28"-  , "1971-0-29 = 1971-01-29"-  , "1971-0-30 = 1971-01-30"-  , "1971-0-31 = 1971-01-31"-  , "1971-0-32 = 1971-01-31"-  , "1971-0-40 = 1971-01-31"-  , "1971-1--7 = 1971-01-01"-  , "1971-1--1 = 1971-01-01"-  , "1971-1-0 = 1971-01-01"-  , "1971-1-1 = 1971-01-01"-  , "1971-1-2 = 1971-01-02"-  , "1971-1-27 = 1971-01-27"-  , "1971-1-28 = 1971-01-28"-  , "1971-1-29 = 1971-01-29"-  , "1971-1-30 = 1971-01-30"-  , "1971-1-31 = 1971-01-31"-  , "1971-1-32 = 1971-01-31"-  , "1971-1-40 = 1971-01-31"-  , "1971-2--7 = 1971-02-01"-  , "1971-2--1 = 1971-02-01"-  , "1971-2-0 = 1971-02-01"-  , "1971-2-1 = 1971-02-01"-  , "1971-2-2 = 1971-02-02"-  , "1971-2-27 = 1971-02-27"-  , "1971-2-28 = 1971-02-28"-  , "1971-2-29 = 1971-02-28"-  , "1971-2-30 = 1971-02-28"-  , "1971-2-31 = 1971-02-28"-  , "1971-2-32 = 1971-02-28"-  , "1971-2-40 = 1971-02-28"-  , "1971-12--7 = 1971-12-01"-  , "1971-12--1 = 1971-12-01"-  , "1971-12-0 = 1971-12-01"-  , "1971-12-1 = 1971-12-01"-  , "1971-12-2 = 1971-12-02"-  , "1971-12-27 = 1971-12-27"-  , "1971-12-28 = 1971-12-28"-  , "1971-12-29 = 1971-12-29"-  , "1971-12-30 = 1971-12-30"-  , "1971-12-31 = 1971-12-31"-  , "1971-12-32 = 1971-12-31"-  , "1971-12-40 = 1971-12-31"-  , "1971-13--7 = 1971-12-01"-  , "1971-13--1 = 1971-12-01"-  , "1971-13-0 = 1971-12-01"-  , "1971-13-1 = 1971-12-01"-  , "1971-13-2 = 1971-12-02"-  , "1971-13-27 = 1971-12-27"-  , "1971-13-28 = 1971-12-28"-  , "1971-13-29 = 1971-12-29"-  , "1971-13-30 = 1971-12-30"-  , "1971-13-31 = 1971-12-31"-  , "1971-13-32 = 1971-12-31"-  , "1971-13-40 = 1971-12-31"-  , "1971-17--7 = 1971-12-01"-  , "1971-17--1 = 1971-12-01"-  , "1971-17-0 = 1971-12-01"-  , "1971-17-1 = 1971-12-01"-  , "1971-17-2 = 1971-12-02"-  , "1971-17-27 = 1971-12-27"-  , "1971-17-28 = 1971-12-28"-  , "1971-17-29 = 1971-12-29"-  , "1971-17-30 = 1971-12-30"-  , "1971-17-31 = 1971-12-31"-  , "1971-17-32 = 1971-12-31"-  , "1971-17-40 = 1971-12-31"-  , "ISOWeekDay"-  , "1968-W-20--2 = 1968-W01-1"-  , "1968-W-20--1 = 1968-W01-1"-  , "1968-W-20-0 = 1968-W01-1"-  , "1968-W-20-1 = 1968-W01-1"-  , "1968-W-20-4 = 1968-W01-4"-  , "1968-W-20-6 = 1968-W01-6"-  , "1968-W-20-7 = 1968-W01-7"-  , "1968-W-20-8 = 1968-W01-7"-  , "1968-W-20-9 = 1968-W01-7"-  , "1968-W-1--2 = 1968-W01-1"-  , "1968-W-1--1 = 1968-W01-1"-  , "1968-W-1-0 = 1968-W01-1"-  , "1968-W-1-1 = 1968-W01-1"-  , "1968-W-1-4 = 1968-W01-4"-  , "1968-W-1-6 = 1968-W01-6"-  , "1968-W-1-7 = 1968-W01-7"-  , "1968-W-1-8 = 1968-W01-7"-  , "1968-W-1-9 = 1968-W01-7"-  , "1968-W0--2 = 1968-W01-1"-  , "1968-W0--1 = 1968-W01-1"-  , "1968-W0-0 = 1968-W01-1"-  , "1968-W0-1 = 1968-W01-1"-  , "1968-W0-4 = 1968-W01-4"-  , "1968-W0-6 = 1968-W01-6"-  , "1968-W0-7 = 1968-W01-7"-  , "1968-W0-8 = 1968-W01-7"-  , "1968-W0-9 = 1968-W01-7"-  , "1968-W1--2 = 1968-W01-1"-  , "1968-W1--1 = 1968-W01-1"-  , "1968-W1-0 = 1968-W01-1"-  , "1968-W1-1 = 1968-W01-1"-  , "1968-W1-4 = 1968-W01-4"-  , "1968-W1-6 = 1968-W01-6"-  , "1968-W1-7 = 1968-W01-7"-  , "1968-W1-8 = 1968-W01-7"-  , "1968-W1-9 = 1968-W01-7"-  , "1968-W20--2 = 1968-W20-1"-  , "1968-W20--1 = 1968-W20-1"-  , "1968-W20-0 = 1968-W20-1"-  , "1968-W20-1 = 1968-W20-1"-  , "1968-W20-4 = 1968-W20-4"-  , "1968-W20-6 = 1968-W20-6"-  , "1968-W20-7 = 1968-W20-7"-  , "1968-W20-8 = 1968-W20-7"-  , "1968-W20-9 = 1968-W20-7"-  , "1968-W51--2 = 1968-W51-1"-  , "1968-W51--1 = 1968-W51-1"-  , "1968-W51-0 = 1968-W51-1"-  , "1968-W51-1 = 1968-W51-1"-  , "1968-W51-4 = 1968-W51-4"-  , "1968-W51-6 = 1968-W51-6"-  , "1968-W51-7 = 1968-W51-7"-  , "1968-W51-8 = 1968-W51-7"-  , "1968-W51-9 = 1968-W51-7"-  , "1968-W52--2 = 1968-W52-1"-  , "1968-W52--1 = 1968-W52-1"-  , "1968-W52-0 = 1968-W52-1"-  , "1968-W52-1 = 1968-W52-1"-  , "1968-W52-4 = 1968-W52-4"-  , "1968-W52-6 = 1968-W52-6"-  , "1968-W52-7 = 1968-W52-7"-  , "1968-W52-8 = 1968-W52-7"-  , "1968-W52-9 = 1968-W52-7"-  , "1968-W53--2 = 1968-W52-1"-  , "1968-W53--1 = 1968-W52-1"-  , "1968-W53-0 = 1968-W52-1"-  , "1968-W53-1 = 1968-W52-1"-  , "1968-W53-4 = 1968-W52-4"-  , "1968-W53-6 = 1968-W52-6"-  , "1968-W53-7 = 1968-W52-7"-  , "1968-W53-8 = 1968-W52-7"-  , "1968-W53-9 = 1968-W52-7"-  , "1968-W54--2 = 1968-W52-1"-  , "1968-W54--1 = 1968-W52-1"-  , "1968-W54-0 = 1968-W52-1"-  , "1968-W54-1 = 1968-W52-1"-  , "1968-W54-4 = 1968-W52-4"-  , "1968-W54-6 = 1968-W52-6"-  , "1968-W54-7 = 1968-W52-7"-  , "1968-W54-8 = 1968-W52-7"-  , "1968-W54-9 = 1968-W52-7"-  , "1969-W-20--2 = 1969-W01-1"-  , "1969-W-20--1 = 1969-W01-1"-  , "1969-W-20-0 = 1969-W01-1"-  , "1969-W-20-1 = 1969-W01-1"-  , "1969-W-20-4 = 1969-W01-4"-  , "1969-W-20-6 = 1969-W01-6"-  , "1969-W-20-7 = 1969-W01-7"-  , "1969-W-20-8 = 1969-W01-7"-  , "1969-W-20-9 = 1969-W01-7"-  , "1969-W-1--2 = 1969-W01-1"-  , "1969-W-1--1 = 1969-W01-1"-  , "1969-W-1-0 = 1969-W01-1"-  , "1969-W-1-1 = 1969-W01-1"-  , "1969-W-1-4 = 1969-W01-4"-  , "1969-W-1-6 = 1969-W01-6"-  , "1969-W-1-7 = 1969-W01-7"-  , "1969-W-1-8 = 1969-W01-7"-  , "1969-W-1-9 = 1969-W01-7"-  , "1969-W0--2 = 1969-W01-1"-  , "1969-W0--1 = 1969-W01-1"-  , "1969-W0-0 = 1969-W01-1"-  , "1969-W0-1 = 1969-W01-1"-  , "1969-W0-4 = 1969-W01-4"-  , "1969-W0-6 = 1969-W01-6"-  , "1969-W0-7 = 1969-W01-7"-  , "1969-W0-8 = 1969-W01-7"-  , "1969-W0-9 = 1969-W01-7"-  , "1969-W1--2 = 1969-W01-1"-  , "1969-W1--1 = 1969-W01-1"-  , "1969-W1-0 = 1969-W01-1"-  , "1969-W1-1 = 1969-W01-1"-  , "1969-W1-4 = 1969-W01-4"-  , "1969-W1-6 = 1969-W01-6"-  , "1969-W1-7 = 1969-W01-7"-  , "1969-W1-8 = 1969-W01-7"-  , "1969-W1-9 = 1969-W01-7"-  , "1969-W20--2 = 1969-W20-1"-  , "1969-W20--1 = 1969-W20-1"-  , "1969-W20-0 = 1969-W20-1"-  , "1969-W20-1 = 1969-W20-1"-  , "1969-W20-4 = 1969-W20-4"-  , "1969-W20-6 = 1969-W20-6"-  , "1969-W20-7 = 1969-W20-7"-  , "1969-W20-8 = 1969-W20-7"-  , "1969-W20-9 = 1969-W20-7"-  , "1969-W51--2 = 1969-W51-1"-  , "1969-W51--1 = 1969-W51-1"-  , "1969-W51-0 = 1969-W51-1"-  , "1969-W51-1 = 1969-W51-1"-  , "1969-W51-4 = 1969-W51-4"-  , "1969-W51-6 = 1969-W51-6"-  , "1969-W51-7 = 1969-W51-7"-  , "1969-W51-8 = 1969-W51-7"-  , "1969-W51-9 = 1969-W51-7"-  , "1969-W52--2 = 1969-W52-1"-  , "1969-W52--1 = 1969-W52-1"-  , "1969-W52-0 = 1969-W52-1"-  , "1969-W52-1 = 1969-W52-1"-  , "1969-W52-4 = 1969-W52-4"-  , "1969-W52-6 = 1969-W52-6"-  , "1969-W52-7 = 1969-W52-7"-  , "1969-W52-8 = 1969-W52-7"-  , "1969-W52-9 = 1969-W52-7"-  , "1969-W53--2 = 1969-W52-1"-  , "1969-W53--1 = 1969-W52-1"-  , "1969-W53-0 = 1969-W52-1"-  , "1969-W53-1 = 1969-W52-1"-  , "1969-W53-4 = 1969-W52-4"-  , "1969-W53-6 = 1969-W52-6"-  , "1969-W53-7 = 1969-W52-7"-  , "1969-W53-8 = 1969-W52-7"-  , "1969-W53-9 = 1969-W52-7"-  , "1969-W54--2 = 1969-W52-1"-  , "1969-W54--1 = 1969-W52-1"-  , "1969-W54-0 = 1969-W52-1"-  , "1969-W54-1 = 1969-W52-1"-  , "1969-W54-4 = 1969-W52-4"-  , "1969-W54-6 = 1969-W52-6"-  , "1969-W54-7 = 1969-W52-7"-  , "1969-W54-8 = 1969-W52-7"-  , "1969-W54-9 = 1969-W52-7"-  , "2004-W-20--2 = 2004-W01-1"-  , "2004-W-20--1 = 2004-W01-1"-  , "2004-W-20-0 = 2004-W01-1"-  , "2004-W-20-1 = 2004-W01-1"-  , "2004-W-20-4 = 2004-W01-4"-  , "2004-W-20-6 = 2004-W01-6"-  , "2004-W-20-7 = 2004-W01-7"-  , "2004-W-20-8 = 2004-W01-7"-  , "2004-W-20-9 = 2004-W01-7"-  , "2004-W-1--2 = 2004-W01-1"-  , "2004-W-1--1 = 2004-W01-1"-  , "2004-W-1-0 = 2004-W01-1"-  , "2004-W-1-1 = 2004-W01-1"-  , "2004-W-1-4 = 2004-W01-4"-  , "2004-W-1-6 = 2004-W01-6"-  , "2004-W-1-7 = 2004-W01-7"-  , "2004-W-1-8 = 2004-W01-7"-  , "2004-W-1-9 = 2004-W01-7"-  , "2004-W0--2 = 2004-W01-1"-  , "2004-W0--1 = 2004-W01-1"-  , "2004-W0-0 = 2004-W01-1"-  , "2004-W0-1 = 2004-W01-1"-  , "2004-W0-4 = 2004-W01-4"-  , "2004-W0-6 = 2004-W01-6"-  , "2004-W0-7 = 2004-W01-7"-  , "2004-W0-8 = 2004-W01-7"-  , "2004-W0-9 = 2004-W01-7"-  , "2004-W1--2 = 2004-W01-1"-  , "2004-W1--1 = 2004-W01-1"-  , "2004-W1-0 = 2004-W01-1"-  , "2004-W1-1 = 2004-W01-1"-  , "2004-W1-4 = 2004-W01-4"-  , "2004-W1-6 = 2004-W01-6"-  , "2004-W1-7 = 2004-W01-7"-  , "2004-W1-8 = 2004-W01-7"-  , "2004-W1-9 = 2004-W01-7"-  , "2004-W20--2 = 2004-W20-1"-  , "2004-W20--1 = 2004-W20-1"-  , "2004-W20-0 = 2004-W20-1"-  , "2004-W20-1 = 2004-W20-1"-  , "2004-W20-4 = 2004-W20-4"-  , "2004-W20-6 = 2004-W20-6"-  , "2004-W20-7 = 2004-W20-7"-  , "2004-W20-8 = 2004-W20-7"-  , "2004-W20-9 = 2004-W20-7"-  , "2004-W51--2 = 2004-W51-1"-  , "2004-W51--1 = 2004-W51-1"-  , "2004-W51-0 = 2004-W51-1"-  , "2004-W51-1 = 2004-W51-1"-  , "2004-W51-4 = 2004-W51-4"-  , "2004-W51-6 = 2004-W51-6"-  , "2004-W51-7 = 2004-W51-7"-  , "2004-W51-8 = 2004-W51-7"-  , "2004-W51-9 = 2004-W51-7"-  , "2004-W52--2 = 2004-W52-1"-  , "2004-W52--1 = 2004-W52-1"-  , "2004-W52-0 = 2004-W52-1"-  , "2004-W52-1 = 2004-W52-1"-  , "2004-W52-4 = 2004-W52-4"-  , "2004-W52-6 = 2004-W52-6"-  , "2004-W52-7 = 2004-W52-7"-  , "2004-W52-8 = 2004-W52-7"-  , "2004-W52-9 = 2004-W52-7"-  , "2004-W53--2 = 2004-W53-1"-  , "2004-W53--1 = 2004-W53-1"-  , "2004-W53-0 = 2004-W53-1"-  , "2004-W53-1 = 2004-W53-1"-  , "2004-W53-4 = 2004-W53-4"-  , "2004-W53-6 = 2004-W53-6"-  , "2004-W53-7 = 2004-W53-7"-  , "2004-W53-8 = 2004-W53-7"-  , "2004-W53-9 = 2004-W53-7"-  , "2004-W54--2 = 2004-W53-1"-  , "2004-W54--1 = 2004-W53-1"-  , "2004-W54-0 = 2004-W53-1"-  , "2004-W54-1 = 2004-W53-1"-  , "2004-W54-4 = 2004-W53-4"-  , "2004-W54-6 = 2004-W53-6"-  , "2004-W54-7 = 2004-W53-7"-  , "2004-W54-8 = 2004-W53-7"-  , "2004-W54-9 = 2004-W53-7" ]
− test/Test/ConvertBack.hs
@@ -1,40 +0,0 @@-module Test.ConvertBack where--import Data.Time.Calendar.OrdinalDate-import Data.Time.Calendar.Julian-import Data.Time.Calendar.WeekDate-import Data.Time.Calendar-import Test.TestUtil--checkDay :: (Show t) => (Day -> t) -> (t -> Day) -> (t -> Maybe Day) -> Day -> String-checkDay encodeDay decodeDay decodeDayValid day = let-    st    = encodeDay day-    day'  = decodeDay st-    mday' = decodeDayValid st--    a = if day /= day'-          then unwords [ show day, "-> "-                           , show st,  "-> "-                           , show day'-                           , "(diff", show (diffDays day' day) ++ ")" ]-          else ""--    b = if Just day /= mday'-          then unwords [show day, "->", show st, "->", show mday']-          else ""-    in a ++ b--checkers :: [Day -> String]-checkers-  = [ checkDay toOrdinalDate (\(y,d) -> fromOrdinalDate y d) (\(y,d) -> fromOrdinalDateValid y d)-    , checkDay toWeekDate (\(y,w,d) -> fromWeekDate y w d) (\(y,w,d) -> fromWeekDateValid y w d)-    , checkDay toGregorian (\(y,m,d) -> fromGregorian y m d) (\(y,m,d) -> fromGregorianValid y m d)-    , checkDay toJulian (\(y,m,d) -> fromJulian y m d) (\(y,m,d) -> fromJulianValid y m d) ]--days :: [Day]-days = [ModifiedJulianDay 50000 .. ModifiedJulianDay 50200] ++-    (fmap (\year -> (fromGregorian year 1 4)) [1980..2000])--convertBack :: Test-convertBack = pureTest "convertBack" $-    diff "" $ concatMap (\ch -> concatMap ch days) checkers
− test/Test/LongWeekYears.hs
@@ -1,20 +0,0 @@-module Test.LongWeekYears where--import Data.Time.Calendar.WeekDate-import Data.Time.Calendar-import Test.TestUtil-import Test.LongWeekYearsRef--longYear :: Integer -> Bool-longYear year = case toWeekDate (fromGregorian year 12 31) of-    (_,53,_) -> True-    _ -> False--showLongYear :: Integer -> String-showLongYear year-  = unwords [ show year ++ ":"-            , (if isLeapYear year then "L" else " ") ++ (if longYear year then "*" else " ") ]--longWeekYears :: Test-longWeekYears = pureTest "longWeekYears" $-    diff longWeekYearsRef $ unlines $ map showLongYear [1901 .. 2050]
− test/Test/LongWeekYearsRef.hs
@@ -1,155 +0,0 @@-module Test.LongWeekYearsRef where--longWeekYearsRef :: String-longWeekYearsRef =- unlines-  [ "1901:   "-  , "1902:   "-  , "1903:  *"-  , "1904: L "-  , "1905:   "-  , "1906:   "-  , "1907:   "-  , "1908: L*"-  , "1909:   "-  , "1910:   "-  , "1911:   "-  , "1912: L "-  , "1913:   "-  , "1914:  *"-  , "1915:   "-  , "1916: L "-  , "1917:   "-  , "1918:   "-  , "1919:   "-  , "1920: L*"-  , "1921:   "-  , "1922:   "-  , "1923:   "-  , "1924: L "-  , "1925:  *"-  , "1926:   "-  , "1927:   "-  , "1928: L "-  , "1929:   "-  , "1930:   "-  , "1931:  *"-  , "1932: L "-  , "1933:   "-  , "1934:   "-  , "1935:   "-  , "1936: L*"-  , "1937:   "-  , "1938:   "-  , "1939:   "-  , "1940: L "-  , "1941:   "-  , "1942:  *"-  , "1943:   "-  , "1944: L "-  , "1945:   "-  , "1946:   "-  , "1947:   "-  , "1948: L*"-  , "1949:   "-  , "1950:   "-  , "1951:   "-  , "1952: L "-  , "1953:  *"-  , "1954:   "-  , "1955:   "-  , "1956: L "-  , "1957:   "-  , "1958:   "-  , "1959:  *"-  , "1960: L "-  , "1961:   "-  , "1962:   "-  , "1963:   "-  , "1964: L*"-  , "1965:   "-  , "1966:   "-  , "1967:   "-  , "1968: L "-  , "1969:   "-  , "1970:  *"-  , "1971:   "-  , "1972: L "-  , "1973:   "-  , "1974:   "-  , "1975:   "-  , "1976: L*"-  , "1977:   "-  , "1978:   "-  , "1979:   "-  , "1980: L "-  , "1981:  *"-  , "1982:   "-  , "1983:   "-  , "1984: L "-  , "1985:   "-  , "1986:   "-  , "1987:  *"-  , "1988: L "-  , "1989:   "-  , "1990:   "-  , "1991:   "-  , "1992: L*"-  , "1993:   "-  , "1994:   "-  , "1995:   "-  , "1996: L "-  , "1997:   "-  , "1998:  *"-  , "1999:   "-  , "2000: L "-  , "2001:   "-  , "2002:   "-  , "2003:   "-  , "2004: L*"-  , "2005:   "-  , "2006:   "-  , "2007:   "-  , "2008: L "-  , "2009:  *"-  , "2010:   "-  , "2011:   "-  , "2012: L "-  , "2013:   "-  , "2014:   "-  , "2015:  *"-  , "2016: L "-  , "2017:   "-  , "2018:   "-  , "2019:   "-  , "2020: L*"-  , "2021:   "-  , "2022:   "-  , "2023:   "-  , "2024: L "-  , "2025:   "-  , "2026:  *"-  , "2027:   "-  , "2028: L "-  , "2029:   "-  , "2030:   "-  , "2031:   "-  , "2032: L*"-  , "2033:   "-  , "2034:   "-  , "2035:   "-  , "2036: L "-  , "2037:  *"-  , "2038:   "-  , "2039:   "-  , "2040: L "-  , "2041:   "-  , "2042:   "-  , "2043:  *"-  , "2044: L "-  , "2045:   "-  , "2046:   "-  , "2047:   "-  , "2048: L*"-  , "2049:   "-  , "2050:   " ]
− test/Test/TestCalendars.hs
@@ -1,30 +0,0 @@-module Test.TestCalendars where--import Data.Time.Calendar.Julian-import Data.Time.Calendar.WeekDate-import Data.Time.Calendar-import Test.TestUtil-import Test.TestCalendarsRef--showers :: [(String,Day -> String)]-showers = [-    ("MJD",show . toModifiedJulianDay),-    ("Gregorian",showGregorian),-    ("Julian",showJulian),-    ("ISO 8601",showWeekDate)-    ]--days :: [Day]-days = [-    fromGregorian 0 12 31,-    fromJulian 1752 9 2,-    fromGregorian 1752 9 14,-    fromGregorian 2005 1 23-    ]--testCalendars :: Test-testCalendars = pureTest "testCalendars" $-    diff testCalendarsRef $ unlines $ map (\d -> showShowers d) days-  where-    showShowers day =-        concatMap (\(nm,shower) -> unwords [" ==", nm, shower day]) showers
− test/Test/TestCalendarsRef.hs
@@ -1,9 +0,0 @@-module Test.TestCalendarsRef where--testCalendarsRef :: String-testCalendarsRef =- unlines-  [ " == MJD -678576 == Gregorian 0000-12-31 == Julian 0001-01-02 == ISO 8601 0000-W52-7"-  , " == MJD -38780 == Gregorian 1752-09-13 == Julian 1752-09-02 == ISO 8601 1752-W37-3"-  , " == MJD -38779 == Gregorian 1752-09-14 == Julian 1752-09-03 == ISO 8601 1752-W37-4"-  , " == MJD 53393 == Gregorian 2005-01-23 == Julian 2005-01-10 == ISO 8601 2005-W03-7" ]
− test/Test/TestEaster.hs
@@ -1,36 +0,0 @@-{-# OPTIONS -Wall -Werror #-}--module Test.TestEaster where--import Data.Time.Calendar.Easter-import Data.Time.Calendar-import Data.Time.Format--import Test.TestUtil-import Test.TestEasterRef------days :: [Day]-days = [ModifiedJulianDay 53000 .. ModifiedJulianDay 53014]--showWithWDay :: Day -> String-showWithWDay = formatTime defaultTimeLocale "%F %A"--testEaster :: Test-testEaster = pureTest "testEaster" $ let-    ds = unlines $ map (\day ->-                   unwords [ showWithWDay day, "->"-                           , showWithWDay (sundayAfter day)]) days--    f y = unwords [ show y ++ ", Gregorian: moon,"-                          , show (gregorianPaschalMoon y) ++ ": Easter,"-                          , showWithWDay (gregorianEaster y)]-                  ++ "\n"--    g y = unwords [ show y ++ ", Orthodox : moon,"-                          , show (orthodoxPaschalMoon y) ++ ": Easter,"-                          , showWithWDay (orthodoxEaster y)]-                  ++ "\n"--    in diff testEasterRef $ ds ++ concatMap (\y -> f y ++ g y) [2000..2020]
− test/Test/TestEasterRef.hs
@@ -1,62 +0,0 @@-module Test.TestEasterRef where--testEasterRef :: String-testEasterRef =- unlines-  [ "2003-12-27 Saturday -> 2003-12-28 Sunday"-  , "2003-12-28 Sunday -> 2004-01-04 Sunday"-  , "2003-12-29 Monday -> 2004-01-04 Sunday"-  , "2003-12-30 Tuesday -> 2004-01-04 Sunday"-  , "2003-12-31 Wednesday -> 2004-01-04 Sunday"-  , "2004-01-01 Thursday -> 2004-01-04 Sunday"-  , "2004-01-02 Friday -> 2004-01-04 Sunday"-  , "2004-01-03 Saturday -> 2004-01-04 Sunday"-  , "2004-01-04 Sunday -> 2004-01-11 Sunday"-  , "2004-01-05 Monday -> 2004-01-11 Sunday"-  , "2004-01-06 Tuesday -> 2004-01-11 Sunday"-  , "2004-01-07 Wednesday -> 2004-01-11 Sunday"-  , "2004-01-08 Thursday -> 2004-01-11 Sunday"-  , "2004-01-09 Friday -> 2004-01-11 Sunday"-  , "2004-01-10 Saturday -> 2004-01-11 Sunday"-  , "2000, Gregorian: moon, 2000-04-18: Easter, 2000-04-23 Sunday"-  , "2000, Orthodox : moon, 2000-04-23: Easter, 2000-04-30 Sunday"-  , "2001, Gregorian: moon, 2001-04-08: Easter, 2001-04-15 Sunday"-  , "2001, Orthodox : moon, 2001-04-12: Easter, 2001-04-15 Sunday"-  , "2002, Gregorian: moon, 2002-03-28: Easter, 2002-03-31 Sunday"-  , "2002, Orthodox : moon, 2002-05-01: Easter, 2002-05-05 Sunday"-  , "2003, Gregorian: moon, 2003-04-16: Easter, 2003-04-20 Sunday"-  , "2003, Orthodox : moon, 2003-04-20: Easter, 2003-04-27 Sunday"-  , "2004, Gregorian: moon, 2004-04-05: Easter, 2004-04-11 Sunday"-  , "2004, Orthodox : moon, 2004-04-09: Easter, 2004-04-11 Sunday"-  , "2005, Gregorian: moon, 2005-03-25: Easter, 2005-03-27 Sunday"-  , "2005, Orthodox : moon, 2005-04-28: Easter, 2005-05-01 Sunday"-  , "2006, Gregorian: moon, 2006-04-13: Easter, 2006-04-16 Sunday"-  , "2006, Orthodox : moon, 2006-04-17: Easter, 2006-04-23 Sunday"-  , "2007, Gregorian: moon, 2007-04-02: Easter, 2007-04-08 Sunday"-  , "2007, Orthodox : moon, 2007-04-06: Easter, 2007-04-08 Sunday"-  , "2008, Gregorian: moon, 2008-03-22: Easter, 2008-03-23 Sunday"-  , "2008, Orthodox : moon, 2008-04-25: Easter, 2008-04-27 Sunday"-  , "2009, Gregorian: moon, 2009-04-10: Easter, 2009-04-12 Sunday"-  , "2009, Orthodox : moon, 2009-04-14: Easter, 2009-04-19 Sunday"-  , "2010, Gregorian: moon, 2010-03-30: Easter, 2010-04-04 Sunday"-  , "2010, Orthodox : moon, 2010-04-03: Easter, 2010-04-04 Sunday"-  , "2011, Gregorian: moon, 2011-04-18: Easter, 2011-04-24 Sunday"-  , "2011, Orthodox : moon, 2011-04-22: Easter, 2011-04-24 Sunday"-  , "2012, Gregorian: moon, 2012-04-07: Easter, 2012-04-08 Sunday"-  , "2012, Orthodox : moon, 2012-04-11: Easter, 2012-04-15 Sunday"-  , "2013, Gregorian: moon, 2013-03-27: Easter, 2013-03-31 Sunday"-  , "2013, Orthodox : moon, 2013-04-30: Easter, 2013-05-05 Sunday"-  , "2014, Gregorian: moon, 2014-04-14: Easter, 2014-04-20 Sunday"-  , "2014, Orthodox : moon, 2014-04-18: Easter, 2014-04-20 Sunday"-  , "2015, Gregorian: moon, 2015-04-03: Easter, 2015-04-05 Sunday"-  , "2015, Orthodox : moon, 2015-04-07: Easter, 2015-04-12 Sunday"-  , "2016, Gregorian: moon, 2016-03-23: Easter, 2016-03-27 Sunday"-  , "2016, Orthodox : moon, 2016-04-26: Easter, 2016-05-01 Sunday"-  , "2017, Gregorian: moon, 2017-04-11: Easter, 2017-04-16 Sunday"-  , "2017, Orthodox : moon, 2017-04-15: Easter, 2017-04-16 Sunday"-  , "2018, Gregorian: moon, 2018-03-31: Easter, 2018-04-01 Sunday"-  , "2018, Orthodox : moon, 2018-04-04: Easter, 2018-04-08 Sunday"-  , "2019, Gregorian: moon, 2019-04-18: Easter, 2019-04-21 Sunday"-  , "2019, Orthodox : moon, 2019-04-23: Easter, 2019-04-28 Sunday"-  , "2020, Gregorian: moon, 2020-04-08: Easter, 2020-04-12 Sunday"-  , "2020, Orthodox : moon, 2020-04-12: Easter, 2020-04-19 Sunday" ]
− test/Test/TestFormat.hs
@@ -1,185 +0,0 @@-{-# LANGUAGE ForeignFunctionInterface #-}--module Test.TestFormat where--import Data.Time-import Data.Time.Clock.POSIX-import Data.Char-import Foreign-import Foreign.C-import Control.Exception;-import Test.TestUtil--{--    size_t format_time (-    char *s, size_t maxsize,-    const char *format,-    int isdst,int gmtoff,time_t t);--}--foreign import ccall unsafe "TestFormatStuff.h format_time" format_time :: CString -> CSize -> CString -> CInt -> CInt -> CString -> CTime -> IO CSize--withBuffer :: Int -> (CString -> IO CSize) -> IO String-withBuffer n f = withArray (replicate n 0) (\buffer -> do-            len <- f buffer-            peekCStringLen (buffer,fromIntegral len)-        )--unixFormatTime :: String -> TimeZone -> UTCTime -> IO String-unixFormatTime fmt zone time = withCString fmt (\pfmt -> withCString (timeZoneName zone) (\pzonename ->-        withBuffer 100 (\buffer -> format_time buffer 100 pfmt-                (if timeZoneSummerOnly zone then 1 else 0)-                (fromIntegral (timeZoneMinutes zone * 60))-                pzonename-                (fromInteger (truncate (utcTimeToPOSIXSeconds time)))-            )-        ))--locale :: TimeLocale-locale = defaultTimeLocale {dateTimeFmt = "%a %b %e %H:%M:%S %Y"}--zones :: [TimeZone]-zones = [utc,TimeZone 87 True "Fenwickian Daylight Time"]--baseTime0 :: UTCTime-baseTime0 = localTimeToUTC utc (LocalTime (fromGregorian 1970 01 01) midnight)--baseTime1 :: UTCTime-baseTime1 = localTimeToUTC utc (LocalTime (fromGregorian 2000 01 01) midnight)--getDay :: Integer -> UTCTime-getDay day = addUTCTime ((fromInteger day) * posixDayLength) baseTime1--getYearP1 :: Integer -> UTCTime-getYearP1 year = localTimeToUTC utc (LocalTime (fromGregorian year 01 01) midnight)--getYearP2 :: Integer -> UTCTime-getYearP2 year = localTimeToUTC utc (LocalTime (fromGregorian year 02 04) midnight)--getYearP3 :: Integer -> UTCTime-getYearP3 year = localTimeToUTC utc (LocalTime (fromGregorian year 03 04) midnight)--getYearP4 :: Integer -> UTCTime-getYearP4 year = localTimeToUTC utc (LocalTime (fromGregorian year 12 31) midnight)--years :: [Integer]-years = [999,1000,1899,1900,1901] ++ [1980..2000] ++ [9999,10000]--times :: [UTCTime]-times = [baseTime0] ++ (fmap getDay [0..23]) ++ (fmap getDay [0..100]) ++-    (fmap getYearP1 years) ++ (fmap getYearP2 years) ++ (fmap getYearP3 years) ++ (fmap getYearP4 years)--padN :: Int -> Char -> String -> String-padN n _ s | n <= (length s) = s-padN n c s = (replicate (n - length s) c) ++ s--unixWorkarounds :: String -> String -> String-unixWorkarounds "%_Y" s = padN 4 ' ' s-unixWorkarounds "%0Y" s = padN 4 '0' s-unixWorkarounds "%_C" s = padN 2 ' ' s-unixWorkarounds "%0C" s = padN 2 '0' s-unixWorkarounds "%_G" s = padN 4 ' ' s-unixWorkarounds "%0G" s = padN 4 '0' s-unixWorkarounds "%_f" s = padN 2 ' ' s-unixWorkarounds "%0f" s = padN 2 '0' s-unixWorkarounds _ s = s--compareFormat :: String -> (String -> String) -> String -> TimeZone -> UTCTime -> Test-compareFormat testname modUnix fmt zone time = let-    ctime = utcToZonedTime zone time-    haskellText = formatTime locale fmt ctime-    in ioTest (testname ++ ": " ++ (show fmt) ++ " of " ++ (show ctime)) $-    do-       unixText <- unixFormatTime fmt zone time-       let expectedText = unixWorkarounds fmt (modUnix unixText)-       return $ diff expectedText haskellText---- as found in http://www.opengroup.org/onlinepubs/007908799/xsh/strftime.html--- plus FgGklz--- f not supported--- P not always supported--- s time-zone dependent-chars :: [Char]-chars = "aAbBcCdDeFgGhHIjklmMnprRStTuUVwWxXyYzZ%"---- as found in "man strftime" on a glibc system. '#' is different, though-modifiers :: [Char]-modifiers = "_-0^"--formats :: [String]-formats =  ["%G-W%V-%u","%U-%w","%W-%u"] ++ (fmap (\char -> '%':char:[]) chars)- ++ (concat (fmap (\char -> fmap (\modifier -> '%':modifier:char:[]) modifiers) chars))--hashformats :: [String]-hashformats =  (fmap (\char -> '%':'#':char:[]) chars)--somestrings :: [String]-somestrings = ["", " ", "-", "\n"]--getBottom :: a -> IO (Maybe Control.Exception.SomeException);-getBottom a = Control.Exception.catch (seq a (return Nothing)) (return . Just);--safeString :: String -> IO String-safeString s = do- msx <- getBottom s- case msx of-  Just sx -> return (show sx)-  Nothing -> case s of-   (c:cc) -> do-    mcx <- getBottom c-    case mcx of-     Just cx -> return (show cx)-     Nothing -> do-      ss <- safeString cc-      return (c:ss)-   [] -> return ""--compareExpected :: (Eq t,Show t,ParseTime t) => String -> String -> String -> Maybe t -> Test-compareExpected testname fmt str expected = ioTest (testname ++ ": " ++ (show fmt) ++ " on " ++ (show str)) $ do-    let found = parseTimeM False defaultTimeLocale fmt str-    mex <- getBottom found-    case mex of-        Just ex -> return $ Fail $ unwords [ "Exception: expected" , show expected ++ ", caught", show ex]-        Nothing -> return $ diff expected found--class (ParseTime t) => TestParse t where-    expectedParse :: String -> String -> Maybe t-    expectedParse "%Z" "" = buildTime defaultTimeLocale []-    expectedParse "%_Z" "" = buildTime defaultTimeLocale []-    expectedParse "%-Z" "" = buildTime defaultTimeLocale []-    expectedParse "%0Z" "" = buildTime defaultTimeLocale []-    expectedParse _ _ = Nothing--instance TestParse Day-instance TestParse TimeOfDay-instance TestParse LocalTime-instance TestParse TimeZone-instance TestParse ZonedTime-instance TestParse UTCTime--checkParse :: String -> String -> [Test]-checkParse fmt str-  =         [ compareExpected "Day" fmt str (expectedParse fmt str :: Maybe Day)-             , compareExpected "TimeOfDay" fmt str (expectedParse fmt str :: Maybe TimeOfDay)-             , compareExpected "LocalTime" fmt str (expectedParse fmt str :: Maybe LocalTime)-             , compareExpected "TimeZone" fmt str (expectedParse fmt str :: Maybe TimeZone)-             , compareExpected "UTCTime" fmt str (expectedParse fmt str :: Maybe UTCTime) ]--testCheckParse :: [Test]-testCheckParse = concatMap (\fmt -> concatMap (\str -> checkParse fmt str) somestrings) formats--testCompareFormat :: [Test]-testCompareFormat = concatMap (\fmt -> concatMap (\time -> fmap (\zone -> compareFormat "compare format" id fmt zone time) zones) times) formats--testCompareHashFormat :: [Test]-testCompareHashFormat = concatMap (\fmt -> concatMap (\time -> fmap (\zone -> compareFormat "compare hashformat" (fmap toLower) fmt zone time) zones) times) hashformats--testFormats :: [Test]-testFormats = [-    testGroup "checkParse" testCheckParse,-    testGroup "compare format" testCompareFormat,-    testGroup "compare hashformat" testCompareHashFormat-    ]--testFormat :: Test-testFormat = testGroup "testFormat" testFormats
− test/Test/TestFormatStuff.c
@@ -1,15 +0,0 @@-#include "TestFormatStuff.h"--size_t format_time (-    char* buffer, size_t maxsize,-    const char* format,-    int isdst,int gmtoff,char* zonename,time_t t)-{-    t += gmtoff;-    struct tm tmd;-    gmtime_r(&t,&tmd);-    tmd.tm_isdst = isdst;-    tmd.tm_gmtoff = gmtoff;-    tmd.tm_zone = zonename;-    return strftime(buffer,maxsize,format,&tmd);-}
− test/Test/TestFormatStuff.h
@@ -1,6 +0,0 @@-#include <time.h>--size_t format_time (-    char *s, size_t maxsize,-    const char *format,-    int isdst,int gmtoff,char* zonename,time_t t);
− test/Test/TestMonthDay.hs
@@ -1,22 +0,0 @@-module Test.TestMonthDay where--import Data.Time.Calendar.MonthDay-import Test.TestUtil-import Test.TestMonthDayRef--showCompare :: (Eq a,Show a) => a -> String -> a -> String-showCompare a1 b a2 | a1 == a2 = (show a1) ++ " == " ++ b-showCompare a1 b a2 = "DIFF: " ++ (show a1) ++ " -> " ++ b ++ " -> " ++ (show a2)--testMonthDay :: Test-testMonthDay = pureTest "testMonthDay" $-    diff testMonthDayRef $ concat $ map (\isL -> unlines (leap isL : yearDays isL)) [False,True]-    where-        leap isLeap = if isLeap then "Leap:" else "Regular:"-        yearDays isLeap =-            map (\yd -> let-                (m,d)  = dayOfYearToMonthAndDay isLeap yd-                yd'    = monthAndDayToDayOfYear isLeap m d-                mdtext = show m ++ "-" ++ show d-            in showCompare yd mdtext yd')-            [-2..369]
− test/Test/TestMonthDayRef.hs
@@ -1,751 +0,0 @@-module Test.TestMonthDayRef where--testMonthDayRef :: String-testMonthDayRef =- unlines-  [ "Regular:"-  , "DIFF: -2 -> 1-1 -> 1"-  , "DIFF: -1 -> 1-1 -> 1"-  , "DIFF: 0 -> 1-1 -> 1"-  , "1 == 1-1"-  , "2 == 1-2"-  , "3 == 1-3"-  , "4 == 1-4"-  , "5 == 1-5"-  , "6 == 1-6"-  , "7 == 1-7"-  , "8 == 1-8"-  , "9 == 1-9"-  , "10 == 1-10"-  , "11 == 1-11"-  , "12 == 1-12"-  , "13 == 1-13"-  , "14 == 1-14"-  , "15 == 1-15"-  , "16 == 1-16"-  , "17 == 1-17"-  , "18 == 1-18"-  , "19 == 1-19"-  , "20 == 1-20"-  , "21 == 1-21"-  , "22 == 1-22"-  , "23 == 1-23"-  , "24 == 1-24"-  , "25 == 1-25"-  , "26 == 1-26"-  , "27 == 1-27"-  , "28 == 1-28"-  , "29 == 1-29"-  , "30 == 1-30"-  , "31 == 1-31"-  , "32 == 2-1"-  , "33 == 2-2"-  , "34 == 2-3"-  , "35 == 2-4"-  , "36 == 2-5"-  , "37 == 2-6"-  , "38 == 2-7"-  , "39 == 2-8"-  , "40 == 2-9"-  , "41 == 2-10"-  , "42 == 2-11"-  , "43 == 2-12"-  , "44 == 2-13"-  , "45 == 2-14"-  , "46 == 2-15"-  , "47 == 2-16"-  , "48 == 2-17"-  , "49 == 2-18"-  , "50 == 2-19"-  , "51 == 2-20"-  , "52 == 2-21"-  , "53 == 2-22"-  , "54 == 2-23"-  , "55 == 2-24"-  , "56 == 2-25"-  , "57 == 2-26"-  , "58 == 2-27"-  , "59 == 2-28"-  , "60 == 3-1"-  , "61 == 3-2"-  , "62 == 3-3"-  , "63 == 3-4"-  , "64 == 3-5"-  , "65 == 3-6"-  , "66 == 3-7"-  , "67 == 3-8"-  , "68 == 3-9"-  , "69 == 3-10"-  , "70 == 3-11"-  , "71 == 3-12"-  , "72 == 3-13"-  , "73 == 3-14"-  , "74 == 3-15"-  , "75 == 3-16"-  , "76 == 3-17"-  , "77 == 3-18"-  , "78 == 3-19"-  , "79 == 3-20"-  , "80 == 3-21"-  , "81 == 3-22"-  , "82 == 3-23"-  , "83 == 3-24"-  , "84 == 3-25"-  , "85 == 3-26"-  , "86 == 3-27"-  , "87 == 3-28"-  , "88 == 3-29"-  , "89 == 3-30"-  , "90 == 3-31"-  , "91 == 4-1"-  , "92 == 4-2"-  , "93 == 4-3"-  , "94 == 4-4"-  , "95 == 4-5"-  , "96 == 4-6"-  , "97 == 4-7"-  , "98 == 4-8"-  , "99 == 4-9"-  , "100 == 4-10"-  , "101 == 4-11"-  , "102 == 4-12"-  , "103 == 4-13"-  , "104 == 4-14"-  , "105 == 4-15"-  , "106 == 4-16"-  , "107 == 4-17"-  , "108 == 4-18"-  , "109 == 4-19"-  , "110 == 4-20"-  , "111 == 4-21"-  , "112 == 4-22"-  , "113 == 4-23"-  , "114 == 4-24"-  , "115 == 4-25"-  , "116 == 4-26"-  , "117 == 4-27"-  , "118 == 4-28"-  , "119 == 4-29"-  , "120 == 4-30"-  , "121 == 5-1"-  , "122 == 5-2"-  , "123 == 5-3"-  , "124 == 5-4"-  , "125 == 5-5"-  , "126 == 5-6"-  , "127 == 5-7"-  , "128 == 5-8"-  , "129 == 5-9"-  , "130 == 5-10"-  , "131 == 5-11"-  , "132 == 5-12"-  , "133 == 5-13"-  , "134 == 5-14"-  , "135 == 5-15"-  , "136 == 5-16"-  , "137 == 5-17"-  , "138 == 5-18"-  , "139 == 5-19"-  , "140 == 5-20"-  , "141 == 5-21"-  , "142 == 5-22"-  , "143 == 5-23"-  , "144 == 5-24"-  , "145 == 5-25"-  , "146 == 5-26"-  , "147 == 5-27"-  , "148 == 5-28"-  , "149 == 5-29"-  , "150 == 5-30"-  , "151 == 5-31"-  , "152 == 6-1"-  , "153 == 6-2"-  , "154 == 6-3"-  , "155 == 6-4"-  , "156 == 6-5"-  , "157 == 6-6"-  , "158 == 6-7"-  , "159 == 6-8"-  , "160 == 6-9"-  , "161 == 6-10"-  , "162 == 6-11"-  , "163 == 6-12"-  , "164 == 6-13"-  , "165 == 6-14"-  , "166 == 6-15"-  , "167 == 6-16"-  , "168 == 6-17"-  , "169 == 6-18"-  , "170 == 6-19"-  , "171 == 6-20"-  , "172 == 6-21"-  , "173 == 6-22"-  , "174 == 6-23"-  , "175 == 6-24"-  , "176 == 6-25"-  , "177 == 6-26"-  , "178 == 6-27"-  , "179 == 6-28"-  , "180 == 6-29"-  , "181 == 6-30"-  , "182 == 7-1"-  , "183 == 7-2"-  , "184 == 7-3"-  , "185 == 7-4"-  , "186 == 7-5"-  , "187 == 7-6"-  , "188 == 7-7"-  , "189 == 7-8"-  , "190 == 7-9"-  , "191 == 7-10"-  , "192 == 7-11"-  , "193 == 7-12"-  , "194 == 7-13"-  , "195 == 7-14"-  , "196 == 7-15"-  , "197 == 7-16"-  , "198 == 7-17"-  , "199 == 7-18"-  , "200 == 7-19"-  , "201 == 7-20"-  , "202 == 7-21"-  , "203 == 7-22"-  , "204 == 7-23"-  , "205 == 7-24"-  , "206 == 7-25"-  , "207 == 7-26"-  , "208 == 7-27"-  , "209 == 7-28"-  , "210 == 7-29"-  , "211 == 7-30"-  , "212 == 7-31"-  , "213 == 8-1"-  , "214 == 8-2"-  , "215 == 8-3"-  , "216 == 8-4"-  , "217 == 8-5"-  , "218 == 8-6"-  , "219 == 8-7"-  , "220 == 8-8"-  , "221 == 8-9"-  , "222 == 8-10"-  , "223 == 8-11"-  , "224 == 8-12"-  , "225 == 8-13"-  , "226 == 8-14"-  , "227 == 8-15"-  , "228 == 8-16"-  , "229 == 8-17"-  , "230 == 8-18"-  , "231 == 8-19"-  , "232 == 8-20"-  , "233 == 8-21"-  , "234 == 8-22"-  , "235 == 8-23"-  , "236 == 8-24"-  , "237 == 8-25"-  , "238 == 8-26"-  , "239 == 8-27"-  , "240 == 8-28"-  , "241 == 8-29"-  , "242 == 8-30"-  , "243 == 8-31"-  , "244 == 9-1"-  , "245 == 9-2"-  , "246 == 9-3"-  , "247 == 9-4"-  , "248 == 9-5"-  , "249 == 9-6"-  , "250 == 9-7"-  , "251 == 9-8"-  , "252 == 9-9"-  , "253 == 9-10"-  , "254 == 9-11"-  , "255 == 9-12"-  , "256 == 9-13"-  , "257 == 9-14"-  , "258 == 9-15"-  , "259 == 9-16"-  , "260 == 9-17"-  , "261 == 9-18"-  , "262 == 9-19"-  , "263 == 9-20"-  , "264 == 9-21"-  , "265 == 9-22"-  , "266 == 9-23"-  , "267 == 9-24"-  , "268 == 9-25"-  , "269 == 9-26"-  , "270 == 9-27"-  , "271 == 9-28"-  , "272 == 9-29"-  , "273 == 9-30"-  , "274 == 10-1"-  , "275 == 10-2"-  , "276 == 10-3"-  , "277 == 10-4"-  , "278 == 10-5"-  , "279 == 10-6"-  , "280 == 10-7"-  , "281 == 10-8"-  , "282 == 10-9"-  , "283 == 10-10"-  , "284 == 10-11"-  , "285 == 10-12"-  , "286 == 10-13"-  , "287 == 10-14"-  , "288 == 10-15"-  , "289 == 10-16"-  , "290 == 10-17"-  , "291 == 10-18"-  , "292 == 10-19"-  , "293 == 10-20"-  , "294 == 10-21"-  , "295 == 10-22"-  , "296 == 10-23"-  , "297 == 10-24"-  , "298 == 10-25"-  , "299 == 10-26"-  , "300 == 10-27"-  , "301 == 10-28"-  , "302 == 10-29"-  , "303 == 10-30"-  , "304 == 10-31"-  , "305 == 11-1"-  , "306 == 11-2"-  , "307 == 11-3"-  , "308 == 11-4"-  , "309 == 11-5"-  , "310 == 11-6"-  , "311 == 11-7"-  , "312 == 11-8"-  , "313 == 11-9"-  , "314 == 11-10"-  , "315 == 11-11"-  , "316 == 11-12"-  , "317 == 11-13"-  , "318 == 11-14"-  , "319 == 11-15"-  , "320 == 11-16"-  , "321 == 11-17"-  , "322 == 11-18"-  , "323 == 11-19"-  , "324 == 11-20"-  , "325 == 11-21"-  , "326 == 11-22"-  , "327 == 11-23"-  , "328 == 11-24"-  , "329 == 11-25"-  , "330 == 11-26"-  , "331 == 11-27"-  , "332 == 11-28"-  , "333 == 11-29"-  , "334 == 11-30"-  , "335 == 12-1"-  , "336 == 12-2"-  , "337 == 12-3"-  , "338 == 12-4"-  , "339 == 12-5"-  , "340 == 12-6"-  , "341 == 12-7"-  , "342 == 12-8"-  , "343 == 12-9"-  , "344 == 12-10"-  , "345 == 12-11"-  , "346 == 12-12"-  , "347 == 12-13"-  , "348 == 12-14"-  , "349 == 12-15"-  , "350 == 12-16"-  , "351 == 12-17"-  , "352 == 12-18"-  , "353 == 12-19"-  , "354 == 12-20"-  , "355 == 12-21"-  , "356 == 12-22"-  , "357 == 12-23"-  , "358 == 12-24"-  , "359 == 12-25"-  , "360 == 12-26"-  , "361 == 12-27"-  , "362 == 12-28"-  , "363 == 12-29"-  , "364 == 12-30"-  , "365 == 12-31"-  , "DIFF: 366 -> 12-31 -> 365"-  , "DIFF: 367 -> 12-31 -> 365"-  , "DIFF: 368 -> 12-31 -> 365"-  , "DIFF: 369 -> 12-31 -> 365"-  , "Leap:"-  , "DIFF: -2 -> 1-1 -> 1"-  , "DIFF: -1 -> 1-1 -> 1"-  , "DIFF: 0 -> 1-1 -> 1"-  , "1 == 1-1"-  , "2 == 1-2"-  , "3 == 1-3"-  , "4 == 1-4"-  , "5 == 1-5"-  , "6 == 1-6"-  , "7 == 1-7"-  , "8 == 1-8"-  , "9 == 1-9"-  , "10 == 1-10"-  , "11 == 1-11"-  , "12 == 1-12"-  , "13 == 1-13"-  , "14 == 1-14"-  , "15 == 1-15"-  , "16 == 1-16"-  , "17 == 1-17"-  , "18 == 1-18"-  , "19 == 1-19"-  , "20 == 1-20"-  , "21 == 1-21"-  , "22 == 1-22"-  , "23 == 1-23"-  , "24 == 1-24"-  , "25 == 1-25"-  , "26 == 1-26"-  , "27 == 1-27"-  , "28 == 1-28"-  , "29 == 1-29"-  , "30 == 1-30"-  , "31 == 1-31"-  , "32 == 2-1"-  , "33 == 2-2"-  , "34 == 2-3"-  , "35 == 2-4"-  , "36 == 2-5"-  , "37 == 2-6"-  , "38 == 2-7"-  , "39 == 2-8"-  , "40 == 2-9"-  , "41 == 2-10"-  , "42 == 2-11"-  , "43 == 2-12"-  , "44 == 2-13"-  , "45 == 2-14"-  , "46 == 2-15"-  , "47 == 2-16"-  , "48 == 2-17"-  , "49 == 2-18"-  , "50 == 2-19"-  , "51 == 2-20"-  , "52 == 2-21"-  , "53 == 2-22"-  , "54 == 2-23"-  , "55 == 2-24"-  , "56 == 2-25"-  , "57 == 2-26"-  , "58 == 2-27"-  , "59 == 2-28"-  , "60 == 2-29"-  , "61 == 3-1"-  , "62 == 3-2"-  , "63 == 3-3"-  , "64 == 3-4"-  , "65 == 3-5"-  , "66 == 3-6"-  , "67 == 3-7"-  , "68 == 3-8"-  , "69 == 3-9"-  , "70 == 3-10"-  , "71 == 3-11"-  , "72 == 3-12"-  , "73 == 3-13"-  , "74 == 3-14"-  , "75 == 3-15"-  , "76 == 3-16"-  , "77 == 3-17"-  , "78 == 3-18"-  , "79 == 3-19"-  , "80 == 3-20"-  , "81 == 3-21"-  , "82 == 3-22"-  , "83 == 3-23"-  , "84 == 3-24"-  , "85 == 3-25"-  , "86 == 3-26"-  , "87 == 3-27"-  , "88 == 3-28"-  , "89 == 3-29"-  , "90 == 3-30"-  , "91 == 3-31"-  , "92 == 4-1"-  , "93 == 4-2"-  , "94 == 4-3"-  , "95 == 4-4"-  , "96 == 4-5"-  , "97 == 4-6"-  , "98 == 4-7"-  , "99 == 4-8"-  , "100 == 4-9"-  , "101 == 4-10"-  , "102 == 4-11"-  , "103 == 4-12"-  , "104 == 4-13"-  , "105 == 4-14"-  , "106 == 4-15"-  , "107 == 4-16"-  , "108 == 4-17"-  , "109 == 4-18"-  , "110 == 4-19"-  , "111 == 4-20"-  , "112 == 4-21"-  , "113 == 4-22"-  , "114 == 4-23"-  , "115 == 4-24"-  , "116 == 4-25"-  , "117 == 4-26"-  , "118 == 4-27"-  , "119 == 4-28"-  , "120 == 4-29"-  , "121 == 4-30"-  , "122 == 5-1"-  , "123 == 5-2"-  , "124 == 5-3"-  , "125 == 5-4"-  , "126 == 5-5"-  , "127 == 5-6"-  , "128 == 5-7"-  , "129 == 5-8"-  , "130 == 5-9"-  , "131 == 5-10"-  , "132 == 5-11"-  , "133 == 5-12"-  , "134 == 5-13"-  , "135 == 5-14"-  , "136 == 5-15"-  , "137 == 5-16"-  , "138 == 5-17"-  , "139 == 5-18"-  , "140 == 5-19"-  , "141 == 5-20"-  , "142 == 5-21"-  , "143 == 5-22"-  , "144 == 5-23"-  , "145 == 5-24"-  , "146 == 5-25"-  , "147 == 5-26"-  , "148 == 5-27"-  , "149 == 5-28"-  , "150 == 5-29"-  , "151 == 5-30"-  , "152 == 5-31"-  , "153 == 6-1"-  , "154 == 6-2"-  , "155 == 6-3"-  , "156 == 6-4"-  , "157 == 6-5"-  , "158 == 6-6"-  , "159 == 6-7"-  , "160 == 6-8"-  , "161 == 6-9"-  , "162 == 6-10"-  , "163 == 6-11"-  , "164 == 6-12"-  , "165 == 6-13"-  , "166 == 6-14"-  , "167 == 6-15"-  , "168 == 6-16"-  , "169 == 6-17"-  , "170 == 6-18"-  , "171 == 6-19"-  , "172 == 6-20"-  , "173 == 6-21"-  , "174 == 6-22"-  , "175 == 6-23"-  , "176 == 6-24"-  , "177 == 6-25"-  , "178 == 6-26"-  , "179 == 6-27"-  , "180 == 6-28"-  , "181 == 6-29"-  , "182 == 6-30"-  , "183 == 7-1"-  , "184 == 7-2"-  , "185 == 7-3"-  , "186 == 7-4"-  , "187 == 7-5"-  , "188 == 7-6"-  , "189 == 7-7"-  , "190 == 7-8"-  , "191 == 7-9"-  , "192 == 7-10"-  , "193 == 7-11"-  , "194 == 7-12"-  , "195 == 7-13"-  , "196 == 7-14"-  , "197 == 7-15"-  , "198 == 7-16"-  , "199 == 7-17"-  , "200 == 7-18"-  , "201 == 7-19"-  , "202 == 7-20"-  , "203 == 7-21"-  , "204 == 7-22"-  , "205 == 7-23"-  , "206 == 7-24"-  , "207 == 7-25"-  , "208 == 7-26"-  , "209 == 7-27"-  , "210 == 7-28"-  , "211 == 7-29"-  , "212 == 7-30"-  , "213 == 7-31"-  , "214 == 8-1"-  , "215 == 8-2"-  , "216 == 8-3"-  , "217 == 8-4"-  , "218 == 8-5"-  , "219 == 8-6"-  , "220 == 8-7"-  , "221 == 8-8"-  , "222 == 8-9"-  , "223 == 8-10"-  , "224 == 8-11"-  , "225 == 8-12"-  , "226 == 8-13"-  , "227 == 8-14"-  , "228 == 8-15"-  , "229 == 8-16"-  , "230 == 8-17"-  , "231 == 8-18"-  , "232 == 8-19"-  , "233 == 8-20"-  , "234 == 8-21"-  , "235 == 8-22"-  , "236 == 8-23"-  , "237 == 8-24"-  , "238 == 8-25"-  , "239 == 8-26"-  , "240 == 8-27"-  , "241 == 8-28"-  , "242 == 8-29"-  , "243 == 8-30"-  , "244 == 8-31"-  , "245 == 9-1"-  , "246 == 9-2"-  , "247 == 9-3"-  , "248 == 9-4"-  , "249 == 9-5"-  , "250 == 9-6"-  , "251 == 9-7"-  , "252 == 9-8"-  , "253 == 9-9"-  , "254 == 9-10"-  , "255 == 9-11"-  , "256 == 9-12"-  , "257 == 9-13"-  , "258 == 9-14"-  , "259 == 9-15"-  , "260 == 9-16"-  , "261 == 9-17"-  , "262 == 9-18"-  , "263 == 9-19"-  , "264 == 9-20"-  , "265 == 9-21"-  , "266 == 9-22"-  , "267 == 9-23"-  , "268 == 9-24"-  , "269 == 9-25"-  , "270 == 9-26"-  , "271 == 9-27"-  , "272 == 9-28"-  , "273 == 9-29"-  , "274 == 9-30"-  , "275 == 10-1"-  , "276 == 10-2"-  , "277 == 10-3"-  , "278 == 10-4"-  , "279 == 10-5"-  , "280 == 10-6"-  , "281 == 10-7"-  , "282 == 10-8"-  , "283 == 10-9"-  , "284 == 10-10"-  , "285 == 10-11"-  , "286 == 10-12"-  , "287 == 10-13"-  , "288 == 10-14"-  , "289 == 10-15"-  , "290 == 10-16"-  , "291 == 10-17"-  , "292 == 10-18"-  , "293 == 10-19"-  , "294 == 10-20"-  , "295 == 10-21"-  , "296 == 10-22"-  , "297 == 10-23"-  , "298 == 10-24"-  , "299 == 10-25"-  , "300 == 10-26"-  , "301 == 10-27"-  , "302 == 10-28"-  , "303 == 10-29"-  , "304 == 10-30"-  , "305 == 10-31"-  , "306 == 11-1"-  , "307 == 11-2"-  , "308 == 11-3"-  , "309 == 11-4"-  , "310 == 11-5"-  , "311 == 11-6"-  , "312 == 11-7"-  , "313 == 11-8"-  , "314 == 11-9"-  , "315 == 11-10"-  , "316 == 11-11"-  , "317 == 11-12"-  , "318 == 11-13"-  , "319 == 11-14"-  , "320 == 11-15"-  , "321 == 11-16"-  , "322 == 11-17"-  , "323 == 11-18"-  , "324 == 11-19"-  , "325 == 11-20"-  , "326 == 11-21"-  , "327 == 11-22"-  , "328 == 11-23"-  , "329 == 11-24"-  , "330 == 11-25"-  , "331 == 11-26"-  , "332 == 11-27"-  , "333 == 11-28"-  , "334 == 11-29"-  , "335 == 11-30"-  , "336 == 12-1"-  , "337 == 12-2"-  , "338 == 12-3"-  , "339 == 12-4"-  , "340 == 12-5"-  , "341 == 12-6"-  , "342 == 12-7"-  , "343 == 12-8"-  , "344 == 12-9"-  , "345 == 12-10"-  , "346 == 12-11"-  , "347 == 12-12"-  , "348 == 12-13"-  , "349 == 12-14"-  , "350 == 12-15"-  , "351 == 12-16"-  , "352 == 12-17"-  , "353 == 12-18"-  , "354 == 12-19"-  , "355 == 12-20"-  , "356 == 12-21"-  , "357 == 12-22"-  , "358 == 12-23"-  , "359 == 12-24"-  , "360 == 12-25"-  , "361 == 12-26"-  , "362 == 12-27"-  , "363 == 12-28"-  , "364 == 12-29"-  , "365 == 12-30"-  , "366 == 12-31"-  , "DIFF: 367 -> 12-31 -> 366"-  , "DIFF: 368 -> 12-31 -> 366"-  , "DIFF: 369 -> 12-31 -> 366" ]
− test/Test/TestParseTime.hs
@@ -1,601 +0,0 @@-{-# OPTIONS -fno-warn-type-defaults -fno-warn-unused-binds -fno-warn-orphans #-}-{-# LANGUAGE FlexibleInstances, ExistentialQuantification #-}--module Test.TestParseTime where--import Control.Monad-import Data.Char-import Data.Ratio-import Data.Time-import Data.Time.Calendar.OrdinalDate-import Data.Time.Calendar.WeekDate-import Data.Time.Clock.POSIX-import Test.QuickCheck hiding (Result,reason)-import Test.QuickCheck.Property-import Test.TestUtil hiding (Result)--ntest :: Int-ntest = 1000--type NamedProperty = (String, Property)--testParseTime :: Test-testParseTime = testGroup "testParseTime"-    [-    readOtherTypesTest,-    readTests,-    simpleFormatTests,-    extests,-    particularParseTests,-    badParseTests,-    defaultTimeZoneTests,-    militaryTimeZoneTests,-    testGroup "properties" (fmap (\(n,prop) -> testProperty n prop) properties)-    ]--yearDays :: Integer -> [Day]-yearDays y = [(fromGregorian y 1 1) .. (fromGregorian y 12 31)]--makeExhaustiveTest :: String -> [t] -> (t -> Test) -> Test-makeExhaustiveTest name cases f = testGroup name (fmap f cases)--extests :: Test-extests = testGroup "exhaustive" ([-    makeExhaustiveTest "parse %y" [0..99] parseYY,-    makeExhaustiveTest "parse %-C %y 1900s" [0,1,50,99] (parseCYY 19),-    makeExhaustiveTest "parse %-C %y 2000s" [0,1,50,99] (parseCYY 20),-    makeExhaustiveTest "parse %-C %y 1400s" [0,1,50,99] (parseCYY 14),-    makeExhaustiveTest "parse %C %y 0700s" [0,1,50,99] (parseCYY2 7),-    makeExhaustiveTest "parse %-C %y 700s" [0,1,50,99] (parseCYY 7),-    makeExhaustiveTest "parse %-C %y 10000s" [0,1,50,99] (parseCYY 100),-    makeExhaustiveTest "parse %-C centuries" [20..100] (parseCentury " "),-    makeExhaustiveTest "parse %-C century X" [1,10,20,100] (parseCentury "X"),-    makeExhaustiveTest "parse %-C century 2sp" [1,10,20,100] (parseCentury "  "),-    makeExhaustiveTest "parse %-C century 5sp" [1,10,20,100] (parseCentury "     ")-    ] ++-    (concat $ fmap-    (\y -> [-    (makeExhaustiveTest "parse %Y%m%d" (yearDays y) parseYMD),-    (makeExhaustiveTest "parse %Y %m %d" (yearDays y) parseYearDayD),-    (makeExhaustiveTest "parse %Y %-m %e" (yearDays y) parseYearDayE)-    ]) [1,4,20,753,2000,2011,10001]))--readTest :: (Eq a,Show a,Read a) => [(a,String)] -> String -> Test-readTest expected target = let-    found = reads target-    result = diff expected found-    name = show target-    in pureTest name result--readTestsParensSpaces :: forall a. (Eq a,Show a,Read a) => a -> String -> Test-readTestsParensSpaces expected target = testGroup target-    [-    readTest [(expected,"")] $ target,-    readTest [(expected,"")] $ "("++target++")",-    readTest [(expected,"")] $ " ("++target++")",-    readTest [(expected," ")] $ " ( "++target++" ) ",-    readTest [(expected," ")] $ " (( "++target++" )) ",-    readTest ([] :: [(a,String)]) $ "("++target,-    readTest [(expected,")")] $ ""++target++")",-    readTest [(expected,"")] $ "(("++target++"))",-    readTest [(expected," ")] $ "  (   (     "++target++"   )  ) "-    ] where--readOtherTypesTest :: Test-readOtherTypesTest = testGroup "read other types"-    [-    readTestsParensSpaces 3 "3",-    readTestsParensSpaces "a" "\"a\""-    ]--readTests :: Test-readTests = testGroup "read times"-    [-    readTestsParensSpaces testDay "1912-07-08",-    --readTestsParensSpaces testDay "1912-7-8",-    readTestsParensSpaces testTimeOfDay "08:04:02"-    --,readTestsParensSpaces testTimeOfDay "8:4:2"-    ] where-    testDay = fromGregorian 1912 7 8-    testTimeOfDay = TimeOfDay 8 4 2--epoch :: LocalTime-epoch = LocalTime (fromGregorian 1970 0 0) midnight--simpleFormatTests :: Test-simpleFormatTests = testGroup "simple"-    [-    readsTest [(epoch,"")] "" "",-    readsTest [(epoch," ")] "" " ",-    readsTest [(epoch,"")] " " " ",-    readsTest [(epoch,"")] " " "  ",-    readsTest [(epoch,"")] "%k" "0",-    readsTest [(epoch,"")] "%k" " 0",-    readsTest [(epoch,"")] "%m" "01",-    readsTest [(epoch," ")] "%m" "01 ",-    readsTest [(epoch," ")] " %m" " 01 ",-    readsTest [(epoch,"")] " %m" " 01",-    -- https://ghc.haskell.org/trac/ghc/ticket/9150-    readsTest [(epoch,"")] " %M" " 00",-    readsTest [(epoch,"")] "%M " "00 ",-    readsTest [(epoch,"")] "%Q" "",-    readsTest [(epoch," ")] "%Q" " ",-    readsTest [(epoch,"X")] "%Q" "X",-    readsTest [(epoch," X")] "%Q" " X",-    readsTest [(epoch,"")] "%Q " " ",-    readsTest [(epoch,"")] "%Q X" " X",-    readsTest [(epoch,"")] "%QX" "X"-    ] where-    readsTest :: (Show a, Eq a, ParseTime a) => [(a,String)] -> String -> String -> Test-    readsTest expected formatStr target = let-        found = readSTime False defaultTimeLocale formatStr target-        result = diff expected found-        name = (show formatStr) ++ " of " ++ (show target)-        in pureTest name result--spacingTests :: (Show t, Eq t, ParseTime t) => t -> String -> String -> Test-spacingTests expected formatStr target = testGroup "particular"-    [-        parseTest False (Just expected) formatStr target,-        parseTest True (Just expected) formatStr target,-        parseTest False (Just expected) (formatStr ++ " ") (target ++ " "),-        parseTest True (Just expected) (formatStr ++ " ") (target ++ " "),-        parseTest False (Just expected) (" " ++ formatStr) (" " ++ target),-        parseTest True (Just expected) (" " ++ formatStr) (" " ++ target),-        parseTest True (Just expected) ("" ++ formatStr) (" " ++ target),-        parseTest True (Just expected) (" " ++ formatStr) ("  " ++ target)-    ]--particularParseTests :: Test-particularParseTests = testGroup "particular"-    [-        spacingTests epoch "%Q" "",-        spacingTests epoch "%Q" ".0",-        spacingTests epoch "%k" " 0",-        spacingTests epoch "%M" "00",-        spacingTests epoch "%m" "01",-        spacingTests (TimeZone 120 False "") "%z" "+0200",-        spacingTests (TimeZone 120 False "") "%Z" "+0200",-        spacingTests (TimeZone (-480) False "PST") "%Z" "PST"-    ]--badParseTests :: Test-badParseTests = testGroup "bad"-    [-        parseTest False (Nothing :: Maybe Day) "%Y" ""-    ]--parseYMD :: Day -> Test-parseYMD day = case toGregorian day of-    (y,m,d) -> parseTest False (Just day) "%Y%m%d" ((show y) ++ (show2 m) ++ (show2 d))--parseYearDayD :: Day -> Test-parseYearDayD day = case toGregorian day of-    (y,m,d) -> parseTest False (Just day) "%Y %m %d" ((show y) ++ " " ++ (show2 m) ++ " " ++ (show2 d))--parseYearDayE :: Day -> Test-parseYearDayE day = case toGregorian day of-    (y,m,d) -> parseTest False (Just day) "%Y %-m %e" ((show y) ++ " " ++ (show m) ++ " " ++ (show d))---- | 1969 - 2068-expectedYear :: Integer -> Integer-expectedYear i | i >= 69 = 1900 + i-expectedYear i = 2000 + i--show2 :: (Show n,Integral n) => n -> String-show2 i = (show (div i 10)) ++ (show (mod i 10))--parseYY :: Integer -> Test-parseYY i = parseTest False (Just (fromGregorian (expectedYear i) 1 1)) "%y" (show2 i)--parseCYY :: Integer -> Integer -> Test-parseCYY c i = parseTest False (Just (fromGregorian ((c * 100) + i) 1 1)) "%-C %y" ((show c) ++ " " ++ (show2 i))--parseCYY2 :: Integer -> Integer -> Test-parseCYY2 c i = parseTest False (Just (fromGregorian ((c * 100) + i) 1 1)) "%C %y" ((show2 c) ++ " " ++ (show2 i))--parseCentury :: String -> Integer -> Test-parseCentury int c = parseTest False (Just (fromGregorian (c * 100) 1 1)) ("%-C" ++ int ++ "%y") ((show c) ++ int ++ "00")--parseTest :: (Show t, Eq t, ParseTime t) => Bool -> Maybe t -> String -> String -> Test-parseTest sp expected formatStr target =-    let-        found = parse sp formatStr target-        result = diff expected found-        name = (show formatStr) ++ " of " ++ (show target) ++ (if sp then " allowing spaces" else "")-    in pureTest name result-{--readsTest :: forall t. (Show t, Eq t, ParseTime t) => Maybe t -> String -> String -> Test-readsTest (Just e) = readsTest' [(e,"")]-readsTest Nothing = readsTest' ([] :: [(t,String)])--}--enumAdd :: (Enum a) => Int -> a -> a-enumAdd i a = toEnum (i + fromEnum a)--getMilZoneLetter :: Int -> Char-getMilZoneLetter 0 = 'Z'-getMilZoneLetter h | h < 0 = enumAdd (negate h) 'M'-getMilZoneLetter h | h < 10 = enumAdd (h - 1) 'A'-getMilZoneLetter h = enumAdd (h - 10) 'K'--getMilZone :: Int -> TimeZone-getMilZone hour = TimeZone (hour * 60) False [getMilZoneLetter hour]--testParseTimeZone :: TimeZone -> Test-testParseTimeZone tz = parseTest False (Just tz) "%Z" (timeZoneName tz)--defaultTimeZoneTests :: Test-defaultTimeZoneTests = testGroup "default time zones" (fmap testParseTimeZone (knownTimeZones defaultTimeLocale))--militaryTimeZoneTests :: Test-militaryTimeZoneTests = testGroup "military time zones" (fmap (testParseTimeZone . getMilZone) [-12 .. 12])---parse :: ParseTime t => Bool -> String -> String -> Maybe t-parse sp f t = parseTimeM sp defaultTimeLocale f t--format :: (FormatTime t) => String -> t -> String-format f t = formatTime defaultTimeLocale f t--instance Arbitrary Day where-    arbitrary = liftM ModifiedJulianDay $ choose (-313698, 2973483) -- 1000-01-1 to 9999-12-31--instance CoArbitrary Day where-    coarbitrary (ModifiedJulianDay d) = coarbitrary d--instance Arbitrary DiffTime where-    arbitrary = oneof [intSecs, fracSecs] -- up to 1 leap second-        where intSecs = liftM secondsToDiffTime' $ choose (0, 86400)-              fracSecs = liftM picosecondsToDiffTime' $ choose (0, 86400 * 10^12)-              secondsToDiffTime' :: Integer -> DiffTime-              secondsToDiffTime' = fromInteger-              picosecondsToDiffTime' :: Integer -> DiffTime-              picosecondsToDiffTime' x = fromRational (x % 10^12)--instance CoArbitrary DiffTime where-    coarbitrary t = coarbitrary (fromEnum t)--instance Arbitrary TimeOfDay where-    arbitrary = liftM timeToTimeOfDay arbitrary--instance CoArbitrary TimeOfDay where-    coarbitrary t = coarbitrary (timeOfDayToTime t)--instance Arbitrary LocalTime where-    arbitrary = liftM2 LocalTime arbitrary arbitrary--instance CoArbitrary LocalTime where-    coarbitrary t = coarbitrary (truncate (utcTimeToPOSIXSeconds (localTimeToUTC utc t)) :: Integer)--instance Arbitrary TimeZone where-    arbitrary = liftM minutesToTimeZone $ choose (-720,720)--instance CoArbitrary TimeZone where-    coarbitrary tz = coarbitrary (timeZoneMinutes tz)--instance Arbitrary ZonedTime where-    arbitrary = liftM2 ZonedTime arbitrary arbitrary--instance CoArbitrary ZonedTime where-    coarbitrary t = coarbitrary (truncate (utcTimeToPOSIXSeconds (zonedTimeToUTC t)) :: Integer)--instance Arbitrary UTCTime where-    arbitrary = liftM2 UTCTime arbitrary arbitrary--instance CoArbitrary UTCTime where-    coarbitrary t = coarbitrary (truncate (utcTimeToPOSIXSeconds t) :: Integer)--instance Arbitrary UniversalTime where-    arbitrary = liftM (\n -> ModJulianDate $ n % k) $ choose (-313698 * k, 2973483 * k) where -- 1000-01-1 to 9999-12-31-        k = 86400--instance CoArbitrary UniversalTime where-    coarbitrary (ModJulianDate d) = coarbitrary d---- missing from the time package-instance Eq ZonedTime where-    ZonedTime t1 tz1 == ZonedTime t2 tz2 = t1 == t2 && tz1 == tz2--compareResult' :: (Eq a,Show a) => String -> a -> a -> Result-compareResult' extra expected found-    | expected == found = succeeded-    | otherwise = failed {reason = "expected " ++ (show expected) ++ ", found " ++ (show found) ++ extra}--compareResult :: (Eq a,Show a) => a -> a -> Result-compareResult = compareResult' ""--compareParse :: forall a. (Eq a,Show a,ParseTime a) => a -> String -> String -> Result-compareParse expected fmt text = compareResult' (", parsing " ++ (show text)) (Just expected) (parse False fmt text)------- * tests for dbugging failing cases-----test_parse_format :: (FormatTime t,ParseTime t,Show t) => String -> t -> (String,String,Maybe t)-test_parse_format f t = let s = format f t in (show t, s, parse False f s `asTypeOf` Just t)------- * show and read-----prop_read_show :: (Read a, Show a, Eq a) => a -> Result-prop_read_show t = compareResult [(t,"")] (reads (show t))--prop_read_show' :: (Read a, Show a, Eq a) => a -> Result-prop_read_show' t = compareResult t (read (show t))------- * special show functions-----prop_parse_showWeekDate :: Day -> Result-prop_parse_showWeekDate d = compareParse d "%G-W%V-%u" (showWeekDate d)--prop_parse_showGregorian :: Day -> Result-prop_parse_showGregorian d = compareParse d "%Y-%m-%d" (showGregorian d)--prop_parse_showOrdinalDate :: Day -> Result-prop_parse_showOrdinalDate d = compareParse d "%Y-%j" (showOrdinalDate d)------- * fromMondayStartWeek and fromSundayStartWeek-----prop_fromMondayStartWeek :: Day -> Result-prop_fromMondayStartWeek d =-    let (w,wd)  = mondayStartWeek d-        (y,_,_) = toGregorian d-     in compareResult d (fromMondayStartWeek y w wd)--prop_fromSundayStartWeek :: Day -> Result-prop_fromSundayStartWeek d =-    let (w,wd)  = sundayStartWeek d-        (y,_,_) = toGregorian d-     in compareResult d (fromSundayStartWeek y w wd)------- * format and parse------- | Helper for defining named properties.-prop_named :: (Arbitrary t, Show t, Testable a)-           => String -> (FormatString s -> t -> a) -> String -> FormatString s -> NamedProperty-prop_named n prop typeName f = (n ++ " " ++ typeName ++ " " ++ show f, property (prop f))--prop_parse_format :: (Eq t, FormatTime t, ParseTime t, Show t) => FormatString t -> t -> Result-prop_parse_format (FormatString f) t = compareParse t f (format f t)--prop_parse_format_named :: (Arbitrary t, Eq t, Show t, FormatTime t, ParseTime t)-                           => String -> FormatString t -> NamedProperty-prop_parse_format_named = prop_named "prop_parse_format" prop_parse_format---- Verify case-insensitivity with upper case.-prop_parse_format_upper :: (Eq t, FormatTime t, ParseTime t, Show t) => FormatString t -> t -> Result-prop_parse_format_upper (FormatString f) t = compareParse t f (map toUpper $ format f t)--prop_parse_format_upper_named :: (Arbitrary t, Eq t, Show t, FormatTime t, ParseTime t)-                              => String -> FormatString t -> NamedProperty-prop_parse_format_upper_named = prop_named "prop_parse_format_upper" prop_parse_format_upper---- Verify case-insensitivity with lower case.-prop_parse_format_lower :: (Eq t, FormatTime t, ParseTime t, Show t) => FormatString t -> t -> Result-prop_parse_format_lower (FormatString f) t = compareParse t f (map toLower $ format f t)--prop_parse_format_lower_named :: (Arbitrary t, Eq t, Show t, FormatTime t, ParseTime t)-                              => String -> FormatString t -> NamedProperty-prop_parse_format_lower_named = prop_named "prop_parse_format_lower" prop_parse_format_lower--prop_format_parse_format :: (FormatTime t, ParseTime t, Show t) => FormatString t -> t -> Result-prop_format_parse_format (FormatString f) t = compareResult-    (Just (format f t))-    (fmap (format f) (parse False f (format f t) `asTypeOf` Just t))--prop_format_parse_format_named :: (Arbitrary t, Show t, FormatTime t, ParseTime t)-                                  => String -> FormatString t -> NamedProperty-prop_format_parse_format_named = prop_named "prop_format_parse_format" prop_format_parse_format------- * crashes in parse-----newtype Input = Input String--instance Show Input where-    show (Input s) = s--instance Arbitrary Input where-    arbitrary = liftM Input $ list cs-      where cs = elements (['0'..'9'] ++ ['-',' ','/'] ++ ['a'..'z'] ++ ['A' .. 'Z'])-            list g = sized (\n -> choose (0,n) >>= \l -> replicateM l g)-instance CoArbitrary Input where-    coarbitrary (Input s) = coarbitrary (sum (map ord s))--prop_no_crash_bad_input :: (Eq t, ParseTime t) => FormatString t -> Input -> Property-prop_no_crash_bad_input fs@(FormatString f) (Input s) = property $-    case parse False f s of-      Nothing -> True-      Just t  -> t == t `asTypeOf` formatType fs-  where-prop_no_crash_bad_input_named :: (Eq t, ParseTime t)-                                 => String -> FormatString t -> NamedProperty-prop_no_crash_bad_input_named = prop_named "prop_no_crash_bad_input" prop_no_crash_bad_input------------newtype FormatString a = FormatString String--formatType :: FormatString t -> t-formatType _ = undefined--castFormatString :: FormatString a -> FormatString b-castFormatString (FormatString f) = FormatString f--instance Show (FormatString a) where-    show (FormatString f) = show f--properties :: [NamedProperty]-properties =-    [("prop_fromMondayStartWeek", property prop_fromMondayStartWeek),-     ("prop_fromSundayStartWeek", property prop_fromSundayStartWeek)]- ++ [("prop_read_show Day", property (prop_read_show :: Day -> Result)),-     ("prop_read_show TimeOfDay", property (prop_read_show :: TimeOfDay -> Result)),-     ("prop_read_show LocalTime", property (prop_read_show :: LocalTime -> Result)),-     ("prop_read_show TimeZone", property (prop_read_show :: TimeZone -> Result)),-     ("prop_read_show ZonedTime", property (prop_read_show :: ZonedTime -> Result)),-     ("prop_read_show UTCTime", property (prop_read_show :: UTCTime -> Result)),-     ("prop_read_show UniversalTime", property (prop_read_show :: UniversalTime -> Result))]- ++ [("prop_parse_showWeekDate", property prop_parse_showWeekDate),-     ("prop_parse_showGregorian", property prop_parse_showGregorian),-     ("prop_parse_showOrdinalDate", property prop_parse_showOrdinalDate)]-- ++ map (prop_parse_format_named "Day") dayFormats- ++ map (prop_parse_format_named "TimeOfDay") timeOfDayFormats- ++ map (prop_parse_format_named "LocalTime") localTimeFormats- ++ map (prop_parse_format_named "TimeZone") timeZoneFormats- ++ map (prop_parse_format_named "ZonedTime") zonedTimeFormats- ++ map (prop_parse_format_named "UTCTime") utcTimeFormats- ++ map (prop_parse_format_named "UniversalTime") universalTimeFormats-- ++ map (prop_parse_format_upper_named "Day") dayFormats- ++ map (prop_parse_format_upper_named "TimeOfDay") timeOfDayFormats- ++ map (prop_parse_format_upper_named "LocalTime") localTimeFormats- ++ map (prop_parse_format_upper_named "TimeZone") timeZoneFormats- ++ map (prop_parse_format_upper_named "ZonedTime") zonedTimeFormats- ++ map (prop_parse_format_upper_named "UTCTime") utcTimeFormats- ++ map (prop_parse_format_upper_named "UniversalTime") universalTimeFormats-- ++ map (prop_parse_format_lower_named "Day") dayFormats- ++ map (prop_parse_format_lower_named "TimeOfDay") timeOfDayFormats- ++ map (prop_parse_format_lower_named "LocalTime") localTimeFormats- ++ map (prop_parse_format_lower_named "TimeZone") timeZoneFormats- ++ map (prop_parse_format_lower_named "ZonedTime") zonedTimeFormats- ++ map (prop_parse_format_lower_named "UTCTime") utcTimeFormats- ++ map (prop_parse_format_lower_named "UniversalTime") universalTimeFormats-- ++ map (prop_format_parse_format_named "Day") partialDayFormats- ++ map (prop_format_parse_format_named "TimeOfDay") partialTimeOfDayFormats- ++ map (prop_format_parse_format_named "LocalTime") partialLocalTimeFormats- ++ map (prop_format_parse_format_named "ZonedTime") partialZonedTimeFormats- ++ map (prop_format_parse_format_named "UTCTime") partialUTCTimeFormats- ++ map (prop_format_parse_format_named "UniversalTime") partialUniversalTimeFormats-- ++ map (prop_no_crash_bad_input_named "Day") (dayFormats ++ partialDayFormats ++ failingPartialDayFormats)- ++ map (prop_no_crash_bad_input_named "TimeOfDay") (timeOfDayFormats ++ partialTimeOfDayFormats)- ++ map (prop_no_crash_bad_input_named "LocalTime") (localTimeFormats ++ partialLocalTimeFormats)- ++ map (prop_no_crash_bad_input_named "TimeZone") (timeZoneFormats)- ++ map (prop_no_crash_bad_input_named "ZonedTime") (zonedTimeFormats ++ partialZonedTimeFormats)- ++ map (prop_no_crash_bad_input_named "UTCTime") (utcTimeFormats ++ partialUTCTimeFormats)- ++ map (prop_no_crash_bad_input_named "UniversalTime") (universalTimeFormats ++ partialUniversalTimeFormats)----dayFormats :: [FormatString Day]-dayFormats = map FormatString-    [-     -- numeric year, month, day-     "%Y-%m-%d","%Y%m%d","%C%y%m%d","%Y %m %e","%m/%d/%Y","%d/%m/%Y","%Y/%d/%m","%D %C","%F",-     -- month names-     "%Y-%B-%d","%Y-%b-%d","%Y-%h-%d",-     -- ordinal dates-     "%Y-%j",-     -- ISO week dates-     "%G-%V-%u","%G-%V-%a","%G-%V-%A","%G-%V-%w", "%A week %V, %G", "day %V, week %A, %G",-     "%G-W%V-%u",-     "%f%g-%V-%u","%f%g-%V-%a","%f%g-%V-%A","%f%g-%V-%w", "%A week %V, %f%g", "day %V, week %A, %f%g",-     "%f%g-W%V-%u",-     -- monday and sunday week dates-     "%Y-w%U-%A", "%Y-w%W-%A", "%Y-%A-w%U", "%Y-%A-w%W", "%A week %U, %Y", "%A week %W, %Y"-    ]--timeOfDayFormats :: [FormatString TimeOfDay]-timeOfDayFormats = map FormatString-    [-     -- 24 h formats-     "%H:%M:%S.%q","%k:%M:%S.%q","%H%M%S.%q","%T.%q","%X.%q","%R:%S.%q",-     "%H:%M:%S%Q","%k:%M:%S%Q","%H%M%S%Q","%T%Q","%X%Q","%R:%S%Q",-     -- 12 h formats-     "%I:%M:%S.%q %p","%I:%M:%S.%q %P","%l:%M:%S.%q %p","%r %q",-     "%I:%M:%S%Q %p","%I:%M:%S%Q %P","%l:%M:%S%Q %p","%r %Q"-    ]--localTimeFormats' :: [FormatString LocalTime]-localTimeFormats' = map FormatString $-  concat [ [df ++ " " ++ tf, tf ++ " " ++ df] | FormatString df <- dayFormats,-                                                   FormatString tf <- timeOfDayFormats]--localTimeFormats :: [FormatString LocalTime]-localTimeFormats = map FormatString [{-"%Q","%Q ","%QX"-}]--timeZoneFormats :: [FormatString TimeZone]-timeZoneFormats = map FormatString ["%z","%z%Z","%Z%z","%Z"]--zonedTimeFormats :: [FormatString ZonedTime]-zonedTimeFormats = map FormatString-  ["%a, %d %b %Y %H:%M:%S.%q %z", "%a, %d %b %Y %H:%M:%S%Q %z", "%s.%q %z", "%s%Q %z",-   "%a, %d %b %Y %H:%M:%S.%q %Z", "%a, %d %b %Y %H:%M:%S%Q %Z", "%s.%q %Z", "%s%Q %Z"]--utcTimeFormats :: [FormatString UTCTime]-utcTimeFormats = map FormatString-  ["%s.%q","%s%Q"]--universalTimeFormats :: [FormatString UniversalTime]-universalTimeFormats = map FormatString []------- * Formats that do not include all the information-----partialDayFormats :: [FormatString Day]-partialDayFormats = map FormatString-    [ ]--partialTimeOfDayFormats :: [FormatString TimeOfDay]-partialTimeOfDayFormats = map FormatString-    [ ]--partialLocalTimeFormats :: [FormatString LocalTime]-partialLocalTimeFormats = map FormatString-    [ ]--partialZonedTimeFormats :: [FormatString ZonedTime]-partialZonedTimeFormats = map FormatString-    [-     -- %s does not include second decimals-     "%s %z",-     -- %S does not include second decimals-     "%c", "%a, %d %b %Y %H:%M:%S %Z"-    ]--partialUTCTimeFormats :: [FormatString UTCTime]-partialUTCTimeFormats = map FormatString-    [-     -- %s does not include second decimals-     "%s",-     -- %c does not include second decimals-     "%c"-    ]--partialUniversalTimeFormats :: [FormatString UniversalTime]-partialUniversalTimeFormats = map FormatString-    [ ]-------- * Known failures-----knownFailures :: [NamedProperty]-knownFailures =-    map (prop_format_parse_format_named "Day") failingPartialDayFormats--failingPartialDayFormats :: [FormatString Day]-failingPartialDayFormats = map FormatString-    [ -- ISO week dates with two digit year.-      -- This can fail in the beginning or the end of a year where-      -- the ISO week date year does not match the gregorian year.-     "%g-%V-%u","%g-%V-%a","%g-%V-%A","%g-%V-%w", "%A week %V, %g", "day %V, week %A, %g",-     "%g-W%V-%u"-    ]
− test/Test/TestTAI.hs
@@ -1,60 +0,0 @@-module Test.TestTAI(testTAI) where--import Data.Time-import Data.Time.Clock.TAI-import Test.TestUtil---sampleLeapSecondMap :: LeapSecondMap-sampleLeapSecondMap d | d < fromGregorian 1972 1 1 = Nothing-sampleLeapSecondMap d | d < fromGregorian 1972 7 1 = Just 10-sampleLeapSecondMap d | d < fromGregorian 1975 1 1 = Just 11-sampleLeapSecondMap _ = Nothing--testTAI :: TestTree;-testTAI = testGroup "leap second transition" $ let-    dayA = fromGregorian 1972 6 30-    dayB = fromGregorian 1972 7 1--    utcTime1 = UTCTime dayA 86399-    utcTime2 = UTCTime dayA 86400-    utcTime3 = UTCTime dayB 0--    mAbsTime1 = utcToTAITime sampleLeapSecondMap utcTime1-    mAbsTime2 = utcToTAITime sampleLeapSecondMap utcTime2-    mAbsTime3 = utcToTAITime sampleLeapSecondMap utcTime3-    in-    [-        testCase "mapping" $ do-            assertEqual "dayA" (Just 10) $ sampleLeapSecondMap dayA-            assertEqual "dayB" (Just 11) $ sampleLeapSecondMap dayB-        ,-        testCase "day length" $ do-            assertEqual "dayA" (Just 86401) $ utcDayLength sampleLeapSecondMap dayA-            assertEqual "dayB" (Just 86400) $ utcDayLength sampleLeapSecondMap dayB-        ,-        testCase "differences" $ do-            absTime1 <- assertJust mAbsTime1-            absTime2 <- assertJust mAbsTime2-            absTime3 <- assertJust mAbsTime3-            assertEqual "absTime2 - absTime1" 1 $ diffAbsoluteTime absTime2 absTime1-            assertEqual "absTime3 - absTime2" 1 $ diffAbsoluteTime absTime3 absTime2-        ,-        testGroup "round-trip"-        [-            testCase "1" $ do-                absTime <- assertJust mAbsTime1-                utcTime <- assertJust $ taiToUTCTime sampleLeapSecondMap absTime-                assertEqual "round-trip" utcTime1 utcTime-            ,-            testCase "2" $ do-                absTime <- assertJust mAbsTime2-                utcTime <- assertJust $ taiToUTCTime sampleLeapSecondMap absTime-                assertEqual "round-trip" utcTime2 utcTime-            ,-            testCase "3" $ do-                absTime <- assertJust mAbsTime3-                utcTime <- assertJust $ taiToUTCTime sampleLeapSecondMap absTime-                assertEqual "round-trip" utcTime3 utcTime-        ]-    ]
− test/Test/TestTime.hs
@@ -1,106 +0,0 @@-module Test.TestTime where--import Data.Time.Calendar.OrdinalDate-import Data.Time.Calendar.WeekDate-import Data.Time-import Test.TestUtil-import Test.TestTimeRef--showCal :: Integer -> String-showCal mjd-  = let date    = ModifiedJulianDay mjd-        (y,m,d) = toGregorian date-        date' = fromGregorian y m d-    in concat [ show mjd ++ "="-                 ++ showGregorian date ++ "="-                 ++ showOrdinalDate date ++ "="-                 ++ showWeekDate date-                 ++ "\n"--               , if date == date'-                   then ""-                   else "=" ++ (show $ toModifiedJulianDay date') ++ "!" ]--testCal :: String-testCal-  = concat-        -- days around 1 BCE/1 CE-      [ concatMap showCal [-678950 .. -678930]--        -- days around 1000 CE-      , concatMap showCal [-313710 .. -313690]--        -- days around MJD zero-      , concatMap showCal [-30..30]-      , showCal 40000-      , showCal 50000--        -- 1900 not a leap year-      , showCal 15078-      , showCal 15079--        -- 1980 is a leap year-      , showCal 44297-      , showCal 44298-      , showCal 44299--        -- 1990 not a leap year-      , showCal 47950-      , showCal 47951--        -- 2000 is a leap year-      , showCal 51602-      , showCal 51603-      , showCal 51604--        -- years 2000 and 2001, plus some slop-      , concatMap showCal [51540..52280] ]--showUTCTime :: UTCTime -> String-showUTCTime (UTCTime d t) =  show (toModifiedJulianDay d) ++ "," ++ show t--myzone :: TimeZone-myzone = hoursToTimeZone (- 8)--leapSec1998Cal :: LocalTime-leapSec1998Cal = LocalTime (fromGregorian 1998 12 31) (TimeOfDay 23 59 60.5)--leapSec1998 :: UTCTime-leapSec1998 = localTimeToUTC utc leapSec1998Cal--testUTC :: String-testUTC-  = let lsMineCal = utcToLocalTime myzone leapSec1998-        lsMine = localTimeToUTC myzone lsMineCal-    in unlines [ showCal 51178-           , show leapSec1998Cal-           , showUTCTime leapSec1998-           , show lsMineCal-           , showUTCTime lsMine ]--neglong :: Rational-neglong = -120--poslong :: Rational-poslong = 120--testUT1 :: String-testUT1-  = unlines [ show $ ut1ToLocalTime 0 $ ModJulianDate 51604.0-            , show $ ut1ToLocalTime 0 $ ModJulianDate 51604.5-            , show $ ut1ToLocalTime neglong $ ModJulianDate 51604.0-            , show $ ut1ToLocalTime neglong $ ModJulianDate 51604.5-            , show $ ut1ToLocalTime poslong $ ModJulianDate 51604.0-            , show $ ut1ToLocalTime poslong $ ModJulianDate 51604.5 ]--testTimeOfDayToDayFraction :: String-testTimeOfDayToDayFraction-  = let f = dayFractionToTimeOfDay . timeOfDayToDayFraction-    in unlines [ show $ f $ TimeOfDay 12 34 56.789-               , show $ f $ TimeOfDay 12 34 56.789123-               , show $ f $ TimeOfDay 12 34 56.789123456-               , show $ f $ TimeOfDay 12 34 56.789123456789 ]--testTime :: Test-testTime = pureTest "testTime" $-    diff testTimeRef $ unlines [testCal, testUTC, testUT1, testTimeOfDayToDayFraction]
− test/Test/TestTimeRef.hs
@@ -1,881 +0,0 @@-module Test.TestTimeRef where--testTimeRef :: String-testTimeRef =-  unlines [-  "-678950=-0001-12-23=-0001-357=-0001-W51-4"-  ,"-678949=-0001-12-24=-0001-358=-0001-W51-5"-  ,"-678948=-0001-12-25=-0001-359=-0001-W51-6"-  ,"-678947=-0001-12-26=-0001-360=-0001-W51-7"-  ,"-678946=-0001-12-27=-0001-361=-0001-W52-1"-  ,"-678945=-0001-12-28=-0001-362=-0001-W52-2"-  ,"-678944=-0001-12-29=-0001-363=-0001-W52-3"-  ,"-678943=-0001-12-30=-0001-364=-0001-W52-4"-  ,"-678942=-0001-12-31=-0001-365=-0001-W52-5"-  ,"-678941=0000-01-01=0000-001=-0001-W52-6"-  ,"-678940=0000-01-02=0000-002=-0001-W52-7"-  ,"-678939=0000-01-03=0000-003=0000-W01-1"-  ,"-678938=0000-01-04=0000-004=0000-W01-2"-  ,"-678937=0000-01-05=0000-005=0000-W01-3"-  ,"-678936=0000-01-06=0000-006=0000-W01-4"-  ,"-678935=0000-01-07=0000-007=0000-W01-5"-  ,"-678934=0000-01-08=0000-008=0000-W01-6"-  ,"-678933=0000-01-09=0000-009=0000-W01-7"-  ,"-678932=0000-01-10=0000-010=0000-W02-1"-  ,"-678931=0000-01-11=0000-011=0000-W02-2"-  ,"-678930=0000-01-12=0000-012=0000-W02-3"-  ,"-313710=0999-12-20=0999-354=0999-W51-5"-  ,"-313709=0999-12-21=0999-355=0999-W51-6"-  ,"-313708=0999-12-22=0999-356=0999-W51-7"-  ,"-313707=0999-12-23=0999-357=0999-W52-1"-  ,"-313706=0999-12-24=0999-358=0999-W52-2"-  ,"-313705=0999-12-25=0999-359=0999-W52-3"-  ,"-313704=0999-12-26=0999-360=0999-W52-4"-  ,"-313703=0999-12-27=0999-361=0999-W52-5"-  ,"-313702=0999-12-28=0999-362=0999-W52-6"-  ,"-313701=0999-12-29=0999-363=0999-W52-7"-  ,"-313700=0999-12-30=0999-364=1000-W01-1"-  ,"-313699=0999-12-31=0999-365=1000-W01-2"-  ,"-313698=1000-01-01=1000-001=1000-W01-3"-  ,"-313697=1000-01-02=1000-002=1000-W01-4"-  ,"-313696=1000-01-03=1000-003=1000-W01-5"-  ,"-313695=1000-01-04=1000-004=1000-W01-6"-  ,"-313694=1000-01-05=1000-005=1000-W01-7"-  ,"-313693=1000-01-06=1000-006=1000-W02-1"-  ,"-313692=1000-01-07=1000-007=1000-W02-2"-  ,"-313691=1000-01-08=1000-008=1000-W02-3"-  ,"-313690=1000-01-09=1000-009=1000-W02-4"-  ,"-30=1858-10-18=1858-291=1858-W42-1"-  ,"-29=1858-10-19=1858-292=1858-W42-2"-  ,"-28=1858-10-20=1858-293=1858-W42-3"-  ,"-27=1858-10-21=1858-294=1858-W42-4"-  ,"-26=1858-10-22=1858-295=1858-W42-5"-  ,"-25=1858-10-23=1858-296=1858-W42-6"-  ,"-24=1858-10-24=1858-297=1858-W42-7"-  ,"-23=1858-10-25=1858-298=1858-W43-1"-  ,"-22=1858-10-26=1858-299=1858-W43-2"-  ,"-21=1858-10-27=1858-300=1858-W43-3"-  ,"-20=1858-10-28=1858-301=1858-W43-4"-  ,"-19=1858-10-29=1858-302=1858-W43-5"-  ,"-18=1858-10-30=1858-303=1858-W43-6"-  ,"-17=1858-10-31=1858-304=1858-W43-7"-  ,"-16=1858-11-01=1858-305=1858-W44-1"-  ,"-15=1858-11-02=1858-306=1858-W44-2"-  ,"-14=1858-11-03=1858-307=1858-W44-3"-  ,"-13=1858-11-04=1858-308=1858-W44-4"-  ,"-12=1858-11-05=1858-309=1858-W44-5"-  ,"-11=1858-11-06=1858-310=1858-W44-6"-  ,"-10=1858-11-07=1858-311=1858-W44-7"-  ,"-9=1858-11-08=1858-312=1858-W45-1"-  ,"-8=1858-11-09=1858-313=1858-W45-2"-  ,"-7=1858-11-10=1858-314=1858-W45-3"-  ,"-6=1858-11-11=1858-315=1858-W45-4"-  ,"-5=1858-11-12=1858-316=1858-W45-5"-  ,"-4=1858-11-13=1858-317=1858-W45-6"-  ,"-3=1858-11-14=1858-318=1858-W45-7"-  ,"-2=1858-11-15=1858-319=1858-W46-1"-  ,"-1=1858-11-16=1858-320=1858-W46-2"-  ,"0=1858-11-17=1858-321=1858-W46-3"-  ,"1=1858-11-18=1858-322=1858-W46-4"-  ,"2=1858-11-19=1858-323=1858-W46-5"-  ,"3=1858-11-20=1858-324=1858-W46-6"-  ,"4=1858-11-21=1858-325=1858-W46-7"-  ,"5=1858-11-22=1858-326=1858-W47-1"-  ,"6=1858-11-23=1858-327=1858-W47-2"-  ,"7=1858-11-24=1858-328=1858-W47-3"-  ,"8=1858-11-25=1858-329=1858-W47-4"-  ,"9=1858-11-26=1858-330=1858-W47-5"-  ,"10=1858-11-27=1858-331=1858-W47-6"-  ,"11=1858-11-28=1858-332=1858-W47-7"-  ,"12=1858-11-29=1858-333=1858-W48-1"-  ,"13=1858-11-30=1858-334=1858-W48-2"-  ,"14=1858-12-01=1858-335=1858-W48-3"-  ,"15=1858-12-02=1858-336=1858-W48-4"-  ,"16=1858-12-03=1858-337=1858-W48-5"-  ,"17=1858-12-04=1858-338=1858-W48-6"-  ,"18=1858-12-05=1858-339=1858-W48-7"-  ,"19=1858-12-06=1858-340=1858-W49-1"-  ,"20=1858-12-07=1858-341=1858-W49-2"-  ,"21=1858-12-08=1858-342=1858-W49-3"-  ,"22=1858-12-09=1858-343=1858-W49-4"-  ,"23=1858-12-10=1858-344=1858-W49-5"-  ,"24=1858-12-11=1858-345=1858-W49-6"-  ,"25=1858-12-12=1858-346=1858-W49-7"-  ,"26=1858-12-13=1858-347=1858-W50-1"-  ,"27=1858-12-14=1858-348=1858-W50-2"-  ,"28=1858-12-15=1858-349=1858-W50-3"-  ,"29=1858-12-16=1858-350=1858-W50-4"-  ,"30=1858-12-17=1858-351=1858-W50-5"-  ,"40000=1968-05-24=1968-145=1968-W21-5"-  ,"50000=1995-10-10=1995-283=1995-W41-2"-  ,"15078=1900-02-28=1900-059=1900-W09-3"-  ,"15079=1900-03-01=1900-060=1900-W09-4"-  ,"44297=1980-02-28=1980-059=1980-W09-4"-  ,"44298=1980-02-29=1980-060=1980-W09-5"-  ,"44299=1980-03-01=1980-061=1980-W09-6"-  ,"47950=1990-02-28=1990-059=1990-W09-3"-  ,"47951=1990-03-01=1990-060=1990-W09-4"-  ,"51602=2000-02-28=2000-059=2000-W09-1"-  ,"51603=2000-02-29=2000-060=2000-W09-2"-  ,"51604=2000-03-01=2000-061=2000-W09-3"-  ,"51540=1999-12-28=1999-362=1999-W52-2"-  ,"51541=1999-12-29=1999-363=1999-W52-3"-  ,"51542=1999-12-30=1999-364=1999-W52-4"-  ,"51543=1999-12-31=1999-365=1999-W52-5"-  ,"51544=2000-01-01=2000-001=1999-W52-6"-  ,"51545=2000-01-02=2000-002=1999-W52-7"-  ,"51546=2000-01-03=2000-003=2000-W01-1"-  ,"51547=2000-01-04=2000-004=2000-W01-2"-  ,"51548=2000-01-05=2000-005=2000-W01-3"-  ,"51549=2000-01-06=2000-006=2000-W01-4"-  ,"51550=2000-01-07=2000-007=2000-W01-5"-  ,"51551=2000-01-08=2000-008=2000-W01-6"-  ,"51552=2000-01-09=2000-009=2000-W01-7"-  ,"51553=2000-01-10=2000-010=2000-W02-1"-  ,"51554=2000-01-11=2000-011=2000-W02-2"-  ,"51555=2000-01-12=2000-012=2000-W02-3"-  ,"51556=2000-01-13=2000-013=2000-W02-4"-  ,"51557=2000-01-14=2000-014=2000-W02-5"-  ,"51558=2000-01-15=2000-015=2000-W02-6"-  ,"51559=2000-01-16=2000-016=2000-W02-7"-  ,"51560=2000-01-17=2000-017=2000-W03-1"-  ,"51561=2000-01-18=2000-018=2000-W03-2"-  ,"51562=2000-01-19=2000-019=2000-W03-3"-  ,"51563=2000-01-20=2000-020=2000-W03-4"-  ,"51564=2000-01-21=2000-021=2000-W03-5"-  ,"51565=2000-01-22=2000-022=2000-W03-6"-  ,"51566=2000-01-23=2000-023=2000-W03-7"-  ,"51567=2000-01-24=2000-024=2000-W04-1"-  ,"51568=2000-01-25=2000-025=2000-W04-2"-  ,"51569=2000-01-26=2000-026=2000-W04-3"-  ,"51570=2000-01-27=2000-027=2000-W04-4"-  ,"51571=2000-01-28=2000-028=2000-W04-5"-  ,"51572=2000-01-29=2000-029=2000-W04-6"-  ,"51573=2000-01-30=2000-030=2000-W04-7"-  ,"51574=2000-01-31=2000-031=2000-W05-1"-  ,"51575=2000-02-01=2000-032=2000-W05-2"-  ,"51576=2000-02-02=2000-033=2000-W05-3"-  ,"51577=2000-02-03=2000-034=2000-W05-4"-  ,"51578=2000-02-04=2000-035=2000-W05-5"-  ,"51579=2000-02-05=2000-036=2000-W05-6"-  ,"51580=2000-02-06=2000-037=2000-W05-7"-  ,"51581=2000-02-07=2000-038=2000-W06-1"-  ,"51582=2000-02-08=2000-039=2000-W06-2"-  ,"51583=2000-02-09=2000-040=2000-W06-3"-  ,"51584=2000-02-10=2000-041=2000-W06-4"-  ,"51585=2000-02-11=2000-042=2000-W06-5"-  ,"51586=2000-02-12=2000-043=2000-W06-6"-  ,"51587=2000-02-13=2000-044=2000-W06-7"-  ,"51588=2000-02-14=2000-045=2000-W07-1"-  ,"51589=2000-02-15=2000-046=2000-W07-2"-  ,"51590=2000-02-16=2000-047=2000-W07-3"-  ,"51591=2000-02-17=2000-048=2000-W07-4"-  ,"51592=2000-02-18=2000-049=2000-W07-5"-  ,"51593=2000-02-19=2000-050=2000-W07-6"-  ,"51594=2000-02-20=2000-051=2000-W07-7"-  ,"51595=2000-02-21=2000-052=2000-W08-1"-  ,"51596=2000-02-22=2000-053=2000-W08-2"-  ,"51597=2000-02-23=2000-054=2000-W08-3"-  ,"51598=2000-02-24=2000-055=2000-W08-4"-  ,"51599=2000-02-25=2000-056=2000-W08-5"-  ,"51600=2000-02-26=2000-057=2000-W08-6"-  ,"51601=2000-02-27=2000-058=2000-W08-7"-  ,"51602=2000-02-28=2000-059=2000-W09-1"-  ,"51603=2000-02-29=2000-060=2000-W09-2"-  ,"51604=2000-03-01=2000-061=2000-W09-3"-  ,"51605=2000-03-02=2000-062=2000-W09-4"-  ,"51606=2000-03-03=2000-063=2000-W09-5"-  ,"51607=2000-03-04=2000-064=2000-W09-6"-  ,"51608=2000-03-05=2000-065=2000-W09-7"-  ,"51609=2000-03-06=2000-066=2000-W10-1"-  ,"51610=2000-03-07=2000-067=2000-W10-2"-  ,"51611=2000-03-08=2000-068=2000-W10-3"-  ,"51612=2000-03-09=2000-069=2000-W10-4"-  ,"51613=2000-03-10=2000-070=2000-W10-5"-  ,"51614=2000-03-11=2000-071=2000-W10-6"-  ,"51615=2000-03-12=2000-072=2000-W10-7"-  ,"51616=2000-03-13=2000-073=2000-W11-1"-  ,"51617=2000-03-14=2000-074=2000-W11-2"-  ,"51618=2000-03-15=2000-075=2000-W11-3"-  ,"51619=2000-03-16=2000-076=2000-W11-4"-  ,"51620=2000-03-17=2000-077=2000-W11-5"-  ,"51621=2000-03-18=2000-078=2000-W11-6"-  ,"51622=2000-03-19=2000-079=2000-W11-7"-  ,"51623=2000-03-20=2000-080=2000-W12-1"-  ,"51624=2000-03-21=2000-081=2000-W12-2"-  ,"51625=2000-03-22=2000-082=2000-W12-3"-  ,"51626=2000-03-23=2000-083=2000-W12-4"-  ,"51627=2000-03-24=2000-084=2000-W12-5"-  ,"51628=2000-03-25=2000-085=2000-W12-6"-  ,"51629=2000-03-26=2000-086=2000-W12-7"-  ,"51630=2000-03-27=2000-087=2000-W13-1"-  ,"51631=2000-03-28=2000-088=2000-W13-2"-  ,"51632=2000-03-29=2000-089=2000-W13-3"-  ,"51633=2000-03-30=2000-090=2000-W13-4"-  ,"51634=2000-03-31=2000-091=2000-W13-5"-  ,"51635=2000-04-01=2000-092=2000-W13-6"-  ,"51636=2000-04-02=2000-093=2000-W13-7"-  ,"51637=2000-04-03=2000-094=2000-W14-1"-  ,"51638=2000-04-04=2000-095=2000-W14-2"-  ,"51639=2000-04-05=2000-096=2000-W14-3"-  ,"51640=2000-04-06=2000-097=2000-W14-4"-  ,"51641=2000-04-07=2000-098=2000-W14-5"-  ,"51642=2000-04-08=2000-099=2000-W14-6"-  ,"51643=2000-04-09=2000-100=2000-W14-7"-  ,"51644=2000-04-10=2000-101=2000-W15-1"-  ,"51645=2000-04-11=2000-102=2000-W15-2"-  ,"51646=2000-04-12=2000-103=2000-W15-3"-  ,"51647=2000-04-13=2000-104=2000-W15-4"-  ,"51648=2000-04-14=2000-105=2000-W15-5"-  ,"51649=2000-04-15=2000-106=2000-W15-6"-  ,"51650=2000-04-16=2000-107=2000-W15-7"-  ,"51651=2000-04-17=2000-108=2000-W16-1"-  ,"51652=2000-04-18=2000-109=2000-W16-2"-  ,"51653=2000-04-19=2000-110=2000-W16-3"-  ,"51654=2000-04-20=2000-111=2000-W16-4"-  ,"51655=2000-04-21=2000-112=2000-W16-5"-  ,"51656=2000-04-22=2000-113=2000-W16-6"-  ,"51657=2000-04-23=2000-114=2000-W16-7"-  ,"51658=2000-04-24=2000-115=2000-W17-1"-  ,"51659=2000-04-25=2000-116=2000-W17-2"-  ,"51660=2000-04-26=2000-117=2000-W17-3"-  ,"51661=2000-04-27=2000-118=2000-W17-4"-  ,"51662=2000-04-28=2000-119=2000-W17-5"-  ,"51663=2000-04-29=2000-120=2000-W17-6"-  ,"51664=2000-04-30=2000-121=2000-W17-7"-  ,"51665=2000-05-01=2000-122=2000-W18-1"-  ,"51666=2000-05-02=2000-123=2000-W18-2"-  ,"51667=2000-05-03=2000-124=2000-W18-3"-  ,"51668=2000-05-04=2000-125=2000-W18-4"-  ,"51669=2000-05-05=2000-126=2000-W18-5"-  ,"51670=2000-05-06=2000-127=2000-W18-6"-  ,"51671=2000-05-07=2000-128=2000-W18-7"-  ,"51672=2000-05-08=2000-129=2000-W19-1"-  ,"51673=2000-05-09=2000-130=2000-W19-2"-  ,"51674=2000-05-10=2000-131=2000-W19-3"-  ,"51675=2000-05-11=2000-132=2000-W19-4"-  ,"51676=2000-05-12=2000-133=2000-W19-5"-  ,"51677=2000-05-13=2000-134=2000-W19-6"-  ,"51678=2000-05-14=2000-135=2000-W19-7"-  ,"51679=2000-05-15=2000-136=2000-W20-1"-  ,"51680=2000-05-16=2000-137=2000-W20-2"-  ,"51681=2000-05-17=2000-138=2000-W20-3"-  ,"51682=2000-05-18=2000-139=2000-W20-4"-  ,"51683=2000-05-19=2000-140=2000-W20-5"-  ,"51684=2000-05-20=2000-141=2000-W20-6"-  ,"51685=2000-05-21=2000-142=2000-W20-7"-  ,"51686=2000-05-22=2000-143=2000-W21-1"-  ,"51687=2000-05-23=2000-144=2000-W21-2"-  ,"51688=2000-05-24=2000-145=2000-W21-3"-  ,"51689=2000-05-25=2000-146=2000-W21-4"-  ,"51690=2000-05-26=2000-147=2000-W21-5"-  ,"51691=2000-05-27=2000-148=2000-W21-6"-  ,"51692=2000-05-28=2000-149=2000-W21-7"-  ,"51693=2000-05-29=2000-150=2000-W22-1"-  ,"51694=2000-05-30=2000-151=2000-W22-2"-  ,"51695=2000-05-31=2000-152=2000-W22-3"-  ,"51696=2000-06-01=2000-153=2000-W22-4"-  ,"51697=2000-06-02=2000-154=2000-W22-5"-  ,"51698=2000-06-03=2000-155=2000-W22-6"-  ,"51699=2000-06-04=2000-156=2000-W22-7"-  ,"51700=2000-06-05=2000-157=2000-W23-1"-  ,"51701=2000-06-06=2000-158=2000-W23-2"-  ,"51702=2000-06-07=2000-159=2000-W23-3"-  ,"51703=2000-06-08=2000-160=2000-W23-4"-  ,"51704=2000-06-09=2000-161=2000-W23-5"-  ,"51705=2000-06-10=2000-162=2000-W23-6"-  ,"51706=2000-06-11=2000-163=2000-W23-7"-  ,"51707=2000-06-12=2000-164=2000-W24-1"-  ,"51708=2000-06-13=2000-165=2000-W24-2"-  ,"51709=2000-06-14=2000-166=2000-W24-3"-  ,"51710=2000-06-15=2000-167=2000-W24-4"-  ,"51711=2000-06-16=2000-168=2000-W24-5"-  ,"51712=2000-06-17=2000-169=2000-W24-6"-  ,"51713=2000-06-18=2000-170=2000-W24-7"-  ,"51714=2000-06-19=2000-171=2000-W25-1"-  ,"51715=2000-06-20=2000-172=2000-W25-2"-  ,"51716=2000-06-21=2000-173=2000-W25-3"-  ,"51717=2000-06-22=2000-174=2000-W25-4"-  ,"51718=2000-06-23=2000-175=2000-W25-5"-  ,"51719=2000-06-24=2000-176=2000-W25-6"-  ,"51720=2000-06-25=2000-177=2000-W25-7"-  ,"51721=2000-06-26=2000-178=2000-W26-1"-  ,"51722=2000-06-27=2000-179=2000-W26-2"-  ,"51723=2000-06-28=2000-180=2000-W26-3"-  ,"51724=2000-06-29=2000-181=2000-W26-4"-  ,"51725=2000-06-30=2000-182=2000-W26-5"-  ,"51726=2000-07-01=2000-183=2000-W26-6"-  ,"51727=2000-07-02=2000-184=2000-W26-7"-  ,"51728=2000-07-03=2000-185=2000-W27-1"-  ,"51729=2000-07-04=2000-186=2000-W27-2"-  ,"51730=2000-07-05=2000-187=2000-W27-3"-  ,"51731=2000-07-06=2000-188=2000-W27-4"-  ,"51732=2000-07-07=2000-189=2000-W27-5"-  ,"51733=2000-07-08=2000-190=2000-W27-6"-  ,"51734=2000-07-09=2000-191=2000-W27-7"-  ,"51735=2000-07-10=2000-192=2000-W28-1"-  ,"51736=2000-07-11=2000-193=2000-W28-2"-  ,"51737=2000-07-12=2000-194=2000-W28-3"-  ,"51738=2000-07-13=2000-195=2000-W28-4"-  ,"51739=2000-07-14=2000-196=2000-W28-5"-  ,"51740=2000-07-15=2000-197=2000-W28-6"-  ,"51741=2000-07-16=2000-198=2000-W28-7"-  ,"51742=2000-07-17=2000-199=2000-W29-1"-  ,"51743=2000-07-18=2000-200=2000-W29-2"-  ,"51744=2000-07-19=2000-201=2000-W29-3"-  ,"51745=2000-07-20=2000-202=2000-W29-4"-  ,"51746=2000-07-21=2000-203=2000-W29-5"-  ,"51747=2000-07-22=2000-204=2000-W29-6"-  ,"51748=2000-07-23=2000-205=2000-W29-7"-  ,"51749=2000-07-24=2000-206=2000-W30-1"-  ,"51750=2000-07-25=2000-207=2000-W30-2"-  ,"51751=2000-07-26=2000-208=2000-W30-3"-  ,"51752=2000-07-27=2000-209=2000-W30-4"-  ,"51753=2000-07-28=2000-210=2000-W30-5"-  ,"51754=2000-07-29=2000-211=2000-W30-6"-  ,"51755=2000-07-30=2000-212=2000-W30-7"-  ,"51756=2000-07-31=2000-213=2000-W31-1"-  ,"51757=2000-08-01=2000-214=2000-W31-2"-  ,"51758=2000-08-02=2000-215=2000-W31-3"-  ,"51759=2000-08-03=2000-216=2000-W31-4"-  ,"51760=2000-08-04=2000-217=2000-W31-5"-  ,"51761=2000-08-05=2000-218=2000-W31-6"-  ,"51762=2000-08-06=2000-219=2000-W31-7"-  ,"51763=2000-08-07=2000-220=2000-W32-1"-  ,"51764=2000-08-08=2000-221=2000-W32-2"-  ,"51765=2000-08-09=2000-222=2000-W32-3"-  ,"51766=2000-08-10=2000-223=2000-W32-4"-  ,"51767=2000-08-11=2000-224=2000-W32-5"-  ,"51768=2000-08-12=2000-225=2000-W32-6"-  ,"51769=2000-08-13=2000-226=2000-W32-7"-  ,"51770=2000-08-14=2000-227=2000-W33-1"-  ,"51771=2000-08-15=2000-228=2000-W33-2"-  ,"51772=2000-08-16=2000-229=2000-W33-3"-  ,"51773=2000-08-17=2000-230=2000-W33-4"-  ,"51774=2000-08-18=2000-231=2000-W33-5"-  ,"51775=2000-08-19=2000-232=2000-W33-6"-  ,"51776=2000-08-20=2000-233=2000-W33-7"-  ,"51777=2000-08-21=2000-234=2000-W34-1"-  ,"51778=2000-08-22=2000-235=2000-W34-2"-  ,"51779=2000-08-23=2000-236=2000-W34-3"-  ,"51780=2000-08-24=2000-237=2000-W34-4"-  ,"51781=2000-08-25=2000-238=2000-W34-5"-  ,"51782=2000-08-26=2000-239=2000-W34-6"-  ,"51783=2000-08-27=2000-240=2000-W34-7"-  ,"51784=2000-08-28=2000-241=2000-W35-1"-  ,"51785=2000-08-29=2000-242=2000-W35-2"-  ,"51786=2000-08-30=2000-243=2000-W35-3"-  ,"51787=2000-08-31=2000-244=2000-W35-4"-  ,"51788=2000-09-01=2000-245=2000-W35-5"-  ,"51789=2000-09-02=2000-246=2000-W35-6"-  ,"51790=2000-09-03=2000-247=2000-W35-7"-  ,"51791=2000-09-04=2000-248=2000-W36-1"-  ,"51792=2000-09-05=2000-249=2000-W36-2"-  ,"51793=2000-09-06=2000-250=2000-W36-3"-  ,"51794=2000-09-07=2000-251=2000-W36-4"-  ,"51795=2000-09-08=2000-252=2000-W36-5"-  ,"51796=2000-09-09=2000-253=2000-W36-6"-  ,"51797=2000-09-10=2000-254=2000-W36-7"-  ,"51798=2000-09-11=2000-255=2000-W37-1"-  ,"51799=2000-09-12=2000-256=2000-W37-2"-  ,"51800=2000-09-13=2000-257=2000-W37-3"-  ,"51801=2000-09-14=2000-258=2000-W37-4"-  ,"51802=2000-09-15=2000-259=2000-W37-5"-  ,"51803=2000-09-16=2000-260=2000-W37-6"-  ,"51804=2000-09-17=2000-261=2000-W37-7"-  ,"51805=2000-09-18=2000-262=2000-W38-1"-  ,"51806=2000-09-19=2000-263=2000-W38-2"-  ,"51807=2000-09-20=2000-264=2000-W38-3"-  ,"51808=2000-09-21=2000-265=2000-W38-4"-  ,"51809=2000-09-22=2000-266=2000-W38-5"-  ,"51810=2000-09-23=2000-267=2000-W38-6"-  ,"51811=2000-09-24=2000-268=2000-W38-7"-  ,"51812=2000-09-25=2000-269=2000-W39-1"-  ,"51813=2000-09-26=2000-270=2000-W39-2"-  ,"51814=2000-09-27=2000-271=2000-W39-3"-  ,"51815=2000-09-28=2000-272=2000-W39-4"-  ,"51816=2000-09-29=2000-273=2000-W39-5"-  ,"51817=2000-09-30=2000-274=2000-W39-6"-  ,"51818=2000-10-01=2000-275=2000-W39-7"-  ,"51819=2000-10-02=2000-276=2000-W40-1"-  ,"51820=2000-10-03=2000-277=2000-W40-2"-  ,"51821=2000-10-04=2000-278=2000-W40-3"-  ,"51822=2000-10-05=2000-279=2000-W40-4"-  ,"51823=2000-10-06=2000-280=2000-W40-5"-  ,"51824=2000-10-07=2000-281=2000-W40-6"-  ,"51825=2000-10-08=2000-282=2000-W40-7"-  ,"51826=2000-10-09=2000-283=2000-W41-1"-  ,"51827=2000-10-10=2000-284=2000-W41-2"-  ,"51828=2000-10-11=2000-285=2000-W41-3"-  ,"51829=2000-10-12=2000-286=2000-W41-4"-  ,"51830=2000-10-13=2000-287=2000-W41-5"-  ,"51831=2000-10-14=2000-288=2000-W41-6"-  ,"51832=2000-10-15=2000-289=2000-W41-7"-  ,"51833=2000-10-16=2000-290=2000-W42-1"-  ,"51834=2000-10-17=2000-291=2000-W42-2"-  ,"51835=2000-10-18=2000-292=2000-W42-3"-  ,"51836=2000-10-19=2000-293=2000-W42-4"-  ,"51837=2000-10-20=2000-294=2000-W42-5"-  ,"51838=2000-10-21=2000-295=2000-W42-6"-  ,"51839=2000-10-22=2000-296=2000-W42-7"-  ,"51840=2000-10-23=2000-297=2000-W43-1"-  ,"51841=2000-10-24=2000-298=2000-W43-2"-  ,"51842=2000-10-25=2000-299=2000-W43-3"-  ,"51843=2000-10-26=2000-300=2000-W43-4"-  ,"51844=2000-10-27=2000-301=2000-W43-5"-  ,"51845=2000-10-28=2000-302=2000-W43-6"-  ,"51846=2000-10-29=2000-303=2000-W43-7"-  ,"51847=2000-10-30=2000-304=2000-W44-1"-  ,"51848=2000-10-31=2000-305=2000-W44-2"-  ,"51849=2000-11-01=2000-306=2000-W44-3"-  ,"51850=2000-11-02=2000-307=2000-W44-4"-  ,"51851=2000-11-03=2000-308=2000-W44-5"-  ,"51852=2000-11-04=2000-309=2000-W44-6"-  ,"51853=2000-11-05=2000-310=2000-W44-7"-  ,"51854=2000-11-06=2000-311=2000-W45-1"-  ,"51855=2000-11-07=2000-312=2000-W45-2"-  ,"51856=2000-11-08=2000-313=2000-W45-3"-  ,"51857=2000-11-09=2000-314=2000-W45-4"-  ,"51858=2000-11-10=2000-315=2000-W45-5"-  ,"51859=2000-11-11=2000-316=2000-W45-6"-  ,"51860=2000-11-12=2000-317=2000-W45-7"-  ,"51861=2000-11-13=2000-318=2000-W46-1"-  ,"51862=2000-11-14=2000-319=2000-W46-2"-  ,"51863=2000-11-15=2000-320=2000-W46-3"-  ,"51864=2000-11-16=2000-321=2000-W46-4"-  ,"51865=2000-11-17=2000-322=2000-W46-5"-  ,"51866=2000-11-18=2000-323=2000-W46-6"-  ,"51867=2000-11-19=2000-324=2000-W46-7"-  ,"51868=2000-11-20=2000-325=2000-W47-1"-  ,"51869=2000-11-21=2000-326=2000-W47-2"-  ,"51870=2000-11-22=2000-327=2000-W47-3"-  ,"51871=2000-11-23=2000-328=2000-W47-4"-  ,"51872=2000-11-24=2000-329=2000-W47-5"-  ,"51873=2000-11-25=2000-330=2000-W47-6"-  ,"51874=2000-11-26=2000-331=2000-W47-7"-  ,"51875=2000-11-27=2000-332=2000-W48-1"-  ,"51876=2000-11-28=2000-333=2000-W48-2"-  ,"51877=2000-11-29=2000-334=2000-W48-3"-  ,"51878=2000-11-30=2000-335=2000-W48-4"-  ,"51879=2000-12-01=2000-336=2000-W48-5"-  ,"51880=2000-12-02=2000-337=2000-W48-6"-  ,"51881=2000-12-03=2000-338=2000-W48-7"-  ,"51882=2000-12-04=2000-339=2000-W49-1"-  ,"51883=2000-12-05=2000-340=2000-W49-2"-  ,"51884=2000-12-06=2000-341=2000-W49-3"-  ,"51885=2000-12-07=2000-342=2000-W49-4"-  ,"51886=2000-12-08=2000-343=2000-W49-5"-  ,"51887=2000-12-09=2000-344=2000-W49-6"-  ,"51888=2000-12-10=2000-345=2000-W49-7"-  ,"51889=2000-12-11=2000-346=2000-W50-1"-  ,"51890=2000-12-12=2000-347=2000-W50-2"-  ,"51891=2000-12-13=2000-348=2000-W50-3"-  ,"51892=2000-12-14=2000-349=2000-W50-4"-  ,"51893=2000-12-15=2000-350=2000-W50-5"-  ,"51894=2000-12-16=2000-351=2000-W50-6"-  ,"51895=2000-12-17=2000-352=2000-W50-7"-  ,"51896=2000-12-18=2000-353=2000-W51-1"-  ,"51897=2000-12-19=2000-354=2000-W51-2"-  ,"51898=2000-12-20=2000-355=2000-W51-3"-  ,"51899=2000-12-21=2000-356=2000-W51-4"-  ,"51900=2000-12-22=2000-357=2000-W51-5"-  ,"51901=2000-12-23=2000-358=2000-W51-6"-  ,"51902=2000-12-24=2000-359=2000-W51-7"-  ,"51903=2000-12-25=2000-360=2000-W52-1"-  ,"51904=2000-12-26=2000-361=2000-W52-2"-  ,"51905=2000-12-27=2000-362=2000-W52-3"-  ,"51906=2000-12-28=2000-363=2000-W52-4"-  ,"51907=2000-12-29=2000-364=2000-W52-5"-  ,"51908=2000-12-30=2000-365=2000-W52-6"-  ,"51909=2000-12-31=2000-366=2000-W52-7"-  ,"51910=2001-01-01=2001-001=2001-W01-1"-  ,"51911=2001-01-02=2001-002=2001-W01-2"-  ,"51912=2001-01-03=2001-003=2001-W01-3"-  ,"51913=2001-01-04=2001-004=2001-W01-4"-  ,"51914=2001-01-05=2001-005=2001-W01-5"-  ,"51915=2001-01-06=2001-006=2001-W01-6"-  ,"51916=2001-01-07=2001-007=2001-W01-7"-  ,"51917=2001-01-08=2001-008=2001-W02-1"-  ,"51918=2001-01-09=2001-009=2001-W02-2"-  ,"51919=2001-01-10=2001-010=2001-W02-3"-  ,"51920=2001-01-11=2001-011=2001-W02-4"-  ,"51921=2001-01-12=2001-012=2001-W02-5"-  ,"51922=2001-01-13=2001-013=2001-W02-6"-  ,"51923=2001-01-14=2001-014=2001-W02-7"-  ,"51924=2001-01-15=2001-015=2001-W03-1"-  ,"51925=2001-01-16=2001-016=2001-W03-2"-  ,"51926=2001-01-17=2001-017=2001-W03-3"-  ,"51927=2001-01-18=2001-018=2001-W03-4"-  ,"51928=2001-01-19=2001-019=2001-W03-5"-  ,"51929=2001-01-20=2001-020=2001-W03-6"-  ,"51930=2001-01-21=2001-021=2001-W03-7"-  ,"51931=2001-01-22=2001-022=2001-W04-1"-  ,"51932=2001-01-23=2001-023=2001-W04-2"-  ,"51933=2001-01-24=2001-024=2001-W04-3"-  ,"51934=2001-01-25=2001-025=2001-W04-4"-  ,"51935=2001-01-26=2001-026=2001-W04-5"-  ,"51936=2001-01-27=2001-027=2001-W04-6"-  ,"51937=2001-01-28=2001-028=2001-W04-7"-  ,"51938=2001-01-29=2001-029=2001-W05-1"-  ,"51939=2001-01-30=2001-030=2001-W05-2"-  ,"51940=2001-01-31=2001-031=2001-W05-3"-  ,"51941=2001-02-01=2001-032=2001-W05-4"-  ,"51942=2001-02-02=2001-033=2001-W05-5"-  ,"51943=2001-02-03=2001-034=2001-W05-6"-  ,"51944=2001-02-04=2001-035=2001-W05-7"-  ,"51945=2001-02-05=2001-036=2001-W06-1"-  ,"51946=2001-02-06=2001-037=2001-W06-2"-  ,"51947=2001-02-07=2001-038=2001-W06-3"-  ,"51948=2001-02-08=2001-039=2001-W06-4"-  ,"51949=2001-02-09=2001-040=2001-W06-5"-  ,"51950=2001-02-10=2001-041=2001-W06-6"-  ,"51951=2001-02-11=2001-042=2001-W06-7"-  ,"51952=2001-02-12=2001-043=2001-W07-1"-  ,"51953=2001-02-13=2001-044=2001-W07-2"-  ,"51954=2001-02-14=2001-045=2001-W07-3"-  ,"51955=2001-02-15=2001-046=2001-W07-4"-  ,"51956=2001-02-16=2001-047=2001-W07-5"-  ,"51957=2001-02-17=2001-048=2001-W07-6"-  ,"51958=2001-02-18=2001-049=2001-W07-7"-  ,"51959=2001-02-19=2001-050=2001-W08-1"-  ,"51960=2001-02-20=2001-051=2001-W08-2"-  ,"51961=2001-02-21=2001-052=2001-W08-3"-  ,"51962=2001-02-22=2001-053=2001-W08-4"-  ,"51963=2001-02-23=2001-054=2001-W08-5"-  ,"51964=2001-02-24=2001-055=2001-W08-6"-  ,"51965=2001-02-25=2001-056=2001-W08-7"-  ,"51966=2001-02-26=2001-057=2001-W09-1"-  ,"51967=2001-02-27=2001-058=2001-W09-2"-  ,"51968=2001-02-28=2001-059=2001-W09-3"-  ,"51969=2001-03-01=2001-060=2001-W09-4"-  ,"51970=2001-03-02=2001-061=2001-W09-5"-  ,"51971=2001-03-03=2001-062=2001-W09-6"-  ,"51972=2001-03-04=2001-063=2001-W09-7"-  ,"51973=2001-03-05=2001-064=2001-W10-1"-  ,"51974=2001-03-06=2001-065=2001-W10-2"-  ,"51975=2001-03-07=2001-066=2001-W10-3"-  ,"51976=2001-03-08=2001-067=2001-W10-4"-  ,"51977=2001-03-09=2001-068=2001-W10-5"-  ,"51978=2001-03-10=2001-069=2001-W10-6"-  ,"51979=2001-03-11=2001-070=2001-W10-7"-  ,"51980=2001-03-12=2001-071=2001-W11-1"-  ,"51981=2001-03-13=2001-072=2001-W11-2"-  ,"51982=2001-03-14=2001-073=2001-W11-3"-  ,"51983=2001-03-15=2001-074=2001-W11-4"-  ,"51984=2001-03-16=2001-075=2001-W11-5"-  ,"51985=2001-03-17=2001-076=2001-W11-6"-  ,"51986=2001-03-18=2001-077=2001-W11-7"-  ,"51987=2001-03-19=2001-078=2001-W12-1"-  ,"51988=2001-03-20=2001-079=2001-W12-2"-  ,"51989=2001-03-21=2001-080=2001-W12-3"-  ,"51990=2001-03-22=2001-081=2001-W12-4"-  ,"51991=2001-03-23=2001-082=2001-W12-5"-  ,"51992=2001-03-24=2001-083=2001-W12-6"-  ,"51993=2001-03-25=2001-084=2001-W12-7"-  ,"51994=2001-03-26=2001-085=2001-W13-1"-  ,"51995=2001-03-27=2001-086=2001-W13-2"-  ,"51996=2001-03-28=2001-087=2001-W13-3"-  ,"51997=2001-03-29=2001-088=2001-W13-4"-  ,"51998=2001-03-30=2001-089=2001-W13-5"-  ,"51999=2001-03-31=2001-090=2001-W13-6"-  ,"52000=2001-04-01=2001-091=2001-W13-7"-  ,"52001=2001-04-02=2001-092=2001-W14-1"-  ,"52002=2001-04-03=2001-093=2001-W14-2"-  ,"52003=2001-04-04=2001-094=2001-W14-3"-  ,"52004=2001-04-05=2001-095=2001-W14-4"-  ,"52005=2001-04-06=2001-096=2001-W14-5"-  ,"52006=2001-04-07=2001-097=2001-W14-6"-  ,"52007=2001-04-08=2001-098=2001-W14-7"-  ,"52008=2001-04-09=2001-099=2001-W15-1"-  ,"52009=2001-04-10=2001-100=2001-W15-2"-  ,"52010=2001-04-11=2001-101=2001-W15-3"-  ,"52011=2001-04-12=2001-102=2001-W15-4"-  ,"52012=2001-04-13=2001-103=2001-W15-5"-  ,"52013=2001-04-14=2001-104=2001-W15-6"-  ,"52014=2001-04-15=2001-105=2001-W15-7"-  ,"52015=2001-04-16=2001-106=2001-W16-1"-  ,"52016=2001-04-17=2001-107=2001-W16-2"-  ,"52017=2001-04-18=2001-108=2001-W16-3"-  ,"52018=2001-04-19=2001-109=2001-W16-4"-  ,"52019=2001-04-20=2001-110=2001-W16-5"-  ,"52020=2001-04-21=2001-111=2001-W16-6"-  ,"52021=2001-04-22=2001-112=2001-W16-7"-  ,"52022=2001-04-23=2001-113=2001-W17-1"-  ,"52023=2001-04-24=2001-114=2001-W17-2"-  ,"52024=2001-04-25=2001-115=2001-W17-3"-  ,"52025=2001-04-26=2001-116=2001-W17-4"-  ,"52026=2001-04-27=2001-117=2001-W17-5"-  ,"52027=2001-04-28=2001-118=2001-W17-6"-  ,"52028=2001-04-29=2001-119=2001-W17-7"-  ,"52029=2001-04-30=2001-120=2001-W18-1"-  ,"52030=2001-05-01=2001-121=2001-W18-2"-  ,"52031=2001-05-02=2001-122=2001-W18-3"-  ,"52032=2001-05-03=2001-123=2001-W18-4"-  ,"52033=2001-05-04=2001-124=2001-W18-5"-  ,"52034=2001-05-05=2001-125=2001-W18-6"-  ,"52035=2001-05-06=2001-126=2001-W18-7"-  ,"52036=2001-05-07=2001-127=2001-W19-1"-  ,"52037=2001-05-08=2001-128=2001-W19-2"-  ,"52038=2001-05-09=2001-129=2001-W19-3"-  ,"52039=2001-05-10=2001-130=2001-W19-4"-  ,"52040=2001-05-11=2001-131=2001-W19-5"-  ,"52041=2001-05-12=2001-132=2001-W19-6"-  ,"52042=2001-05-13=2001-133=2001-W19-7"-  ,"52043=2001-05-14=2001-134=2001-W20-1"-  ,"52044=2001-05-15=2001-135=2001-W20-2"-  ,"52045=2001-05-16=2001-136=2001-W20-3"-  ,"52046=2001-05-17=2001-137=2001-W20-4"-  ,"52047=2001-05-18=2001-138=2001-W20-5"-  ,"52048=2001-05-19=2001-139=2001-W20-6"-  ,"52049=2001-05-20=2001-140=2001-W20-7"-  ,"52050=2001-05-21=2001-141=2001-W21-1"-  ,"52051=2001-05-22=2001-142=2001-W21-2"-  ,"52052=2001-05-23=2001-143=2001-W21-3"-  ,"52053=2001-05-24=2001-144=2001-W21-4"-  ,"52054=2001-05-25=2001-145=2001-W21-5"-  ,"52055=2001-05-26=2001-146=2001-W21-6"-  ,"52056=2001-05-27=2001-147=2001-W21-7"-  ,"52057=2001-05-28=2001-148=2001-W22-1"-  ,"52058=2001-05-29=2001-149=2001-W22-2"-  ,"52059=2001-05-30=2001-150=2001-W22-3"-  ,"52060=2001-05-31=2001-151=2001-W22-4"-  ,"52061=2001-06-01=2001-152=2001-W22-5"-  ,"52062=2001-06-02=2001-153=2001-W22-6"-  ,"52063=2001-06-03=2001-154=2001-W22-7"-  ,"52064=2001-06-04=2001-155=2001-W23-1"-  ,"52065=2001-06-05=2001-156=2001-W23-2"-  ,"52066=2001-06-06=2001-157=2001-W23-3"-  ,"52067=2001-06-07=2001-158=2001-W23-4"-  ,"52068=2001-06-08=2001-159=2001-W23-5"-  ,"52069=2001-06-09=2001-160=2001-W23-6"-  ,"52070=2001-06-10=2001-161=2001-W23-7"-  ,"52071=2001-06-11=2001-162=2001-W24-1"-  ,"52072=2001-06-12=2001-163=2001-W24-2"-  ,"52073=2001-06-13=2001-164=2001-W24-3"-  ,"52074=2001-06-14=2001-165=2001-W24-4"-  ,"52075=2001-06-15=2001-166=2001-W24-5"-  ,"52076=2001-06-16=2001-167=2001-W24-6"-  ,"52077=2001-06-17=2001-168=2001-W24-7"-  ,"52078=2001-06-18=2001-169=2001-W25-1"-  ,"52079=2001-06-19=2001-170=2001-W25-2"-  ,"52080=2001-06-20=2001-171=2001-W25-3"-  ,"52081=2001-06-21=2001-172=2001-W25-4"-  ,"52082=2001-06-22=2001-173=2001-W25-5"-  ,"52083=2001-06-23=2001-174=2001-W25-6"-  ,"52084=2001-06-24=2001-175=2001-W25-7"-  ,"52085=2001-06-25=2001-176=2001-W26-1"-  ,"52086=2001-06-26=2001-177=2001-W26-2"-  ,"52087=2001-06-27=2001-178=2001-W26-3"-  ,"52088=2001-06-28=2001-179=2001-W26-4"-  ,"52089=2001-06-29=2001-180=2001-W26-5"-  ,"52090=2001-06-30=2001-181=2001-W26-6"-  ,"52091=2001-07-01=2001-182=2001-W26-7"-  ,"52092=2001-07-02=2001-183=2001-W27-1"-  ,"52093=2001-07-03=2001-184=2001-W27-2"-  ,"52094=2001-07-04=2001-185=2001-W27-3"-  ,"52095=2001-07-05=2001-186=2001-W27-4"-  ,"52096=2001-07-06=2001-187=2001-W27-5"-  ,"52097=2001-07-07=2001-188=2001-W27-6"-  ,"52098=2001-07-08=2001-189=2001-W27-7"-  ,"52099=2001-07-09=2001-190=2001-W28-1"-  ,"52100=2001-07-10=2001-191=2001-W28-2"-  ,"52101=2001-07-11=2001-192=2001-W28-3"-  ,"52102=2001-07-12=2001-193=2001-W28-4"-  ,"52103=2001-07-13=2001-194=2001-W28-5"-  ,"52104=2001-07-14=2001-195=2001-W28-6"-  ,"52105=2001-07-15=2001-196=2001-W28-7"-  ,"52106=2001-07-16=2001-197=2001-W29-1"-  ,"52107=2001-07-17=2001-198=2001-W29-2"-  ,"52108=2001-07-18=2001-199=2001-W29-3"-  ,"52109=2001-07-19=2001-200=2001-W29-4"-  ,"52110=2001-07-20=2001-201=2001-W29-5"-  ,"52111=2001-07-21=2001-202=2001-W29-6"-  ,"52112=2001-07-22=2001-203=2001-W29-7"-  ,"52113=2001-07-23=2001-204=2001-W30-1"-  ,"52114=2001-07-24=2001-205=2001-W30-2"-  ,"52115=2001-07-25=2001-206=2001-W30-3"-  ,"52116=2001-07-26=2001-207=2001-W30-4"-  ,"52117=2001-07-27=2001-208=2001-W30-5"-  ,"52118=2001-07-28=2001-209=2001-W30-6"-  ,"52119=2001-07-29=2001-210=2001-W30-7"-  ,"52120=2001-07-30=2001-211=2001-W31-1"-  ,"52121=2001-07-31=2001-212=2001-W31-2"-  ,"52122=2001-08-01=2001-213=2001-W31-3"-  ,"52123=2001-08-02=2001-214=2001-W31-4"-  ,"52124=2001-08-03=2001-215=2001-W31-5"-  ,"52125=2001-08-04=2001-216=2001-W31-6"-  ,"52126=2001-08-05=2001-217=2001-W31-7"-  ,"52127=2001-08-06=2001-218=2001-W32-1"-  ,"52128=2001-08-07=2001-219=2001-W32-2"-  ,"52129=2001-08-08=2001-220=2001-W32-3"-  ,"52130=2001-08-09=2001-221=2001-W32-4"-  ,"52131=2001-08-10=2001-222=2001-W32-5"-  ,"52132=2001-08-11=2001-223=2001-W32-6"-  ,"52133=2001-08-12=2001-224=2001-W32-7"-  ,"52134=2001-08-13=2001-225=2001-W33-1"-  ,"52135=2001-08-14=2001-226=2001-W33-2"-  ,"52136=2001-08-15=2001-227=2001-W33-3"-  ,"52137=2001-08-16=2001-228=2001-W33-4"-  ,"52138=2001-08-17=2001-229=2001-W33-5"-  ,"52139=2001-08-18=2001-230=2001-W33-6"-  ,"52140=2001-08-19=2001-231=2001-W33-7"-  ,"52141=2001-08-20=2001-232=2001-W34-1"-  ,"52142=2001-08-21=2001-233=2001-W34-2"-  ,"52143=2001-08-22=2001-234=2001-W34-3"-  ,"52144=2001-08-23=2001-235=2001-W34-4"-  ,"52145=2001-08-24=2001-236=2001-W34-5"-  ,"52146=2001-08-25=2001-237=2001-W34-6"-  ,"52147=2001-08-26=2001-238=2001-W34-7"-  ,"52148=2001-08-27=2001-239=2001-W35-1"-  ,"52149=2001-08-28=2001-240=2001-W35-2"-  ,"52150=2001-08-29=2001-241=2001-W35-3"-  ,"52151=2001-08-30=2001-242=2001-W35-4"-  ,"52152=2001-08-31=2001-243=2001-W35-5"-  ,"52153=2001-09-01=2001-244=2001-W35-6"-  ,"52154=2001-09-02=2001-245=2001-W35-7"-  ,"52155=2001-09-03=2001-246=2001-W36-1"-  ,"52156=2001-09-04=2001-247=2001-W36-2"-  ,"52157=2001-09-05=2001-248=2001-W36-3"-  ,"52158=2001-09-06=2001-249=2001-W36-4"-  ,"52159=2001-09-07=2001-250=2001-W36-5"-  ,"52160=2001-09-08=2001-251=2001-W36-6"-  ,"52161=2001-09-09=2001-252=2001-W36-7"-  ,"52162=2001-09-10=2001-253=2001-W37-1"-  ,"52163=2001-09-11=2001-254=2001-W37-2"-  ,"52164=2001-09-12=2001-255=2001-W37-3"-  ,"52165=2001-09-13=2001-256=2001-W37-4"-  ,"52166=2001-09-14=2001-257=2001-W37-5"-  ,"52167=2001-09-15=2001-258=2001-W37-6"-  ,"52168=2001-09-16=2001-259=2001-W37-7"-  ,"52169=2001-09-17=2001-260=2001-W38-1"-  ,"52170=2001-09-18=2001-261=2001-W38-2"-  ,"52171=2001-09-19=2001-262=2001-W38-3"-  ,"52172=2001-09-20=2001-263=2001-W38-4"-  ,"52173=2001-09-21=2001-264=2001-W38-5"-  ,"52174=2001-09-22=2001-265=2001-W38-6"-  ,"52175=2001-09-23=2001-266=2001-W38-7"-  ,"52176=2001-09-24=2001-267=2001-W39-1"-  ,"52177=2001-09-25=2001-268=2001-W39-2"-  ,"52178=2001-09-26=2001-269=2001-W39-3"-  ,"52179=2001-09-27=2001-270=2001-W39-4"-  ,"52180=2001-09-28=2001-271=2001-W39-5"-  ,"52181=2001-09-29=2001-272=2001-W39-6"-  ,"52182=2001-09-30=2001-273=2001-W39-7"-  ,"52183=2001-10-01=2001-274=2001-W40-1"-  ,"52184=2001-10-02=2001-275=2001-W40-2"-  ,"52185=2001-10-03=2001-276=2001-W40-3"-  ,"52186=2001-10-04=2001-277=2001-W40-4"-  ,"52187=2001-10-05=2001-278=2001-W40-5"-  ,"52188=2001-10-06=2001-279=2001-W40-6"-  ,"52189=2001-10-07=2001-280=2001-W40-7"-  ,"52190=2001-10-08=2001-281=2001-W41-1"-  ,"52191=2001-10-09=2001-282=2001-W41-2"-  ,"52192=2001-10-10=2001-283=2001-W41-3"-  ,"52193=2001-10-11=2001-284=2001-W41-4"-  ,"52194=2001-10-12=2001-285=2001-W41-5"-  ,"52195=2001-10-13=2001-286=2001-W41-6"-  ,"52196=2001-10-14=2001-287=2001-W41-7"-  ,"52197=2001-10-15=2001-288=2001-W42-1"-  ,"52198=2001-10-16=2001-289=2001-W42-2"-  ,"52199=2001-10-17=2001-290=2001-W42-3"-  ,"52200=2001-10-18=2001-291=2001-W42-4"-  ,"52201=2001-10-19=2001-292=2001-W42-5"-  ,"52202=2001-10-20=2001-293=2001-W42-6"-  ,"52203=2001-10-21=2001-294=2001-W42-7"-  ,"52204=2001-10-22=2001-295=2001-W43-1"-  ,"52205=2001-10-23=2001-296=2001-W43-2"-  ,"52206=2001-10-24=2001-297=2001-W43-3"-  ,"52207=2001-10-25=2001-298=2001-W43-4"-  ,"52208=2001-10-26=2001-299=2001-W43-5"-  ,"52209=2001-10-27=2001-300=2001-W43-6"-  ,"52210=2001-10-28=2001-301=2001-W43-7"-  ,"52211=2001-10-29=2001-302=2001-W44-1"-  ,"52212=2001-10-30=2001-303=2001-W44-2"-  ,"52213=2001-10-31=2001-304=2001-W44-3"-  ,"52214=2001-11-01=2001-305=2001-W44-4"-  ,"52215=2001-11-02=2001-306=2001-W44-5"-  ,"52216=2001-11-03=2001-307=2001-W44-6"-  ,"52217=2001-11-04=2001-308=2001-W44-7"-  ,"52218=2001-11-05=2001-309=2001-W45-1"-  ,"52219=2001-11-06=2001-310=2001-W45-2"-  ,"52220=2001-11-07=2001-311=2001-W45-3"-  ,"52221=2001-11-08=2001-312=2001-W45-4"-  ,"52222=2001-11-09=2001-313=2001-W45-5"-  ,"52223=2001-11-10=2001-314=2001-W45-6"-  ,"52224=2001-11-11=2001-315=2001-W45-7"-  ,"52225=2001-11-12=2001-316=2001-W46-1"-  ,"52226=2001-11-13=2001-317=2001-W46-2"-  ,"52227=2001-11-14=2001-318=2001-W46-3"-  ,"52228=2001-11-15=2001-319=2001-W46-4"-  ,"52229=2001-11-16=2001-320=2001-W46-5"-  ,"52230=2001-11-17=2001-321=2001-W46-6"-  ,"52231=2001-11-18=2001-322=2001-W46-7"-  ,"52232=2001-11-19=2001-323=2001-W47-1"-  ,"52233=2001-11-20=2001-324=2001-W47-2"-  ,"52234=2001-11-21=2001-325=2001-W47-3"-  ,"52235=2001-11-22=2001-326=2001-W47-4"-  ,"52236=2001-11-23=2001-327=2001-W47-5"-  ,"52237=2001-11-24=2001-328=2001-W47-6"-  ,"52238=2001-11-25=2001-329=2001-W47-7"-  ,"52239=2001-11-26=2001-330=2001-W48-1"-  ,"52240=2001-11-27=2001-331=2001-W48-2"-  ,"52241=2001-11-28=2001-332=2001-W48-3"-  ,"52242=2001-11-29=2001-333=2001-W48-4"-  ,"52243=2001-11-30=2001-334=2001-W48-5"-  ,"52244=2001-12-01=2001-335=2001-W48-6"-  ,"52245=2001-12-02=2001-336=2001-W48-7"-  ,"52246=2001-12-03=2001-337=2001-W49-1"-  ,"52247=2001-12-04=2001-338=2001-W49-2"-  ,"52248=2001-12-05=2001-339=2001-W49-3"-  ,"52249=2001-12-06=2001-340=2001-W49-4"-  ,"52250=2001-12-07=2001-341=2001-W49-5"-  ,"52251=2001-12-08=2001-342=2001-W49-6"-  ,"52252=2001-12-09=2001-343=2001-W49-7"-  ,"52253=2001-12-10=2001-344=2001-W50-1"-  ,"52254=2001-12-11=2001-345=2001-W50-2"-  ,"52255=2001-12-12=2001-346=2001-W50-3"-  ,"52256=2001-12-13=2001-347=2001-W50-4"-  ,"52257=2001-12-14=2001-348=2001-W50-5"-  ,"52258=2001-12-15=2001-349=2001-W50-6"-  ,"52259=2001-12-16=2001-350=2001-W50-7"-  ,"52260=2001-12-17=2001-351=2001-W51-1"-  ,"52261=2001-12-18=2001-352=2001-W51-2"-  ,"52262=2001-12-19=2001-353=2001-W51-3"-  ,"52263=2001-12-20=2001-354=2001-W51-4"-  ,"52264=2001-12-21=2001-355=2001-W51-5"-  ,"52265=2001-12-22=2001-356=2001-W51-6"-  ,"52266=2001-12-23=2001-357=2001-W51-7"-  ,"52267=2001-12-24=2001-358=2001-W52-1"-  ,"52268=2001-12-25=2001-359=2001-W52-2"-  ,"52269=2001-12-26=2001-360=2001-W52-3"-  ,"52270=2001-12-27=2001-361=2001-W52-4"-  ,"52271=2001-12-28=2001-362=2001-W52-5"-  ,"52272=2001-12-29=2001-363=2001-W52-6"-  ,"52273=2001-12-30=2001-364=2001-W52-7"-  ,"52274=2001-12-31=2001-365=2002-W01-1"-  ,"52275=2002-01-01=2002-001=2002-W01-2"-  ,"52276=2002-01-02=2002-002=2002-W01-3"-  ,"52277=2002-01-03=2002-003=2002-W01-4"-  ,"52278=2002-01-04=2002-004=2002-W01-5"-  ,"52279=2002-01-05=2002-005=2002-W01-6"-  ,"52280=2002-01-06=2002-006=2002-W01-7"-  ,""-  ,"51178=1998-12-31=1998-365=1998-W53-4"-  ,""-  ,"1998-12-31 23:59:60.5"-  ,"51178,86400.5s"-  ,"1998-12-31 15:59:60.5"-  ,"51178,86400.5s"-  ,""-  ,"2000-03-01 00:00:00"-  ,"2000-03-01 12:00:00"-  ,"2000-02-29 16:00:00"-  ,"2000-03-01 04:00:00"-  ,"2000-03-01 08:00:00"-  ,"2000-03-01 20:00:00"-  ,""-  ,"12:34:56.789"-  ,"12:34:56.789123"-  ,"12:34:56.789123456"-  ,"12:34:56.789123456789"-  ,"" ]
− test/Test/TestTimeZone.hs
@@ -1,17 +0,0 @@-{-# OPTIONS -Wall -Werror #-}--module Test.TestTimeZone where--import Data.Time-import System.Posix.Env (putEnv)-import Test.TestUtil--testTimeZone :: Test-testTimeZone = ioTest "getTimeZone respects TZ env var" $ do-  putEnv "TZ=UTC+0"-  zone1 <- getTimeZone epoch-  putEnv "TZ=EST+5"-  zone2 <- getTimeZone epoch-  return $ diff False (zone1 == zone2)- where-  epoch = UTCTime (ModifiedJulianDay 0) 0
− test/Test/TestUtil.hs
@@ -1,59 +0,0 @@-{-# OPTIONS -fno-warn-overlapping-patterns #-}-module Test.TestUtil-    (-    module Test.TestUtil,-    module Test.Framework,-    module Test.Framework.Providers.QuickCheck2-    ) where--import Test.Framework-import Test.Framework.Providers.API-import Test.Framework.Providers.QuickCheck2-import Data.Typeable--data Result = Pass | Fail String deriving Typeable--instance Show Result where-    show Pass = "passed"-    show (Fail s) = "failed: " ++ s--instance TestResultlike () Result where-    testSucceeded Pass = True-    testSucceeded (Fail _) = False--instance Testlike () Result (IO Result) where-    testTypeName _ = "Cases"-    runTest _ ior = do-        r <- ior-        return (Finished r,return ())--ioTest :: String -> IO Result -> Test-ioTest = Test--pureTest :: String -> Result -> Test-pureTest name result = ioTest name (return result)--diff :: (Show a,Eq a) => a -> a -> Result-diff expected found | expected == found = Pass-diff expected found = Fail ("expected " ++ (show expected) ++ " but found " ++ (show found))----- for tasty-like test code--type TestTree = Test-type Assertion = Either String ()--testCase :: String -> Assertion -> Test-testCase name (Right ()) = pureTest name Pass-testCase name (Left s) = pureTest name (Fail s)--assertFailure :: String -> Either String a-assertFailure = Left--assertEqual :: (Show a,Eq a) => String -> a -> a -> Assertion-assertEqual _ expected found | expected == found = return ()-assertEqual name expected found = assertFailure $ name ++ ": expected " ++ (show expected) ++ " but found " ++ (show found)--assertJust :: Maybe a -> Either String a-assertJust (Just a) = return a-assertJust Nothing = assertFailure "Nothing"
− test/Test/TestValid.hs
@@ -1,61 +0,0 @@-module Test.TestValid where--import Data.Time-import Data.Time.Calendar.OrdinalDate-import Data.Time.Calendar.WeekDate-import Data.Time.Calendar.Julian-import Test.QuickCheck hiding (Result,reason)-import Test.QuickCheck.Property-import Test.TestUtil hiding (Result)---validResult :: (Eq c,Show c,Eq t,Show t) =>-    Bool -> (t -> c) -> (c -> t) -> (c -> Maybe t) -> c -> Result-validResult valid toComponents fromComponents fromComponentsValid c = let-    mt = fromComponentsValid c-    t' = fromComponents c-    c' = toComponents t'-    in if valid then-        case mt of-            Nothing -> rejected-            Just t -> if t' /= t-                then failed {reason = "'fromValid' gives " ++ show t ++ ", but 'from' gives " ++ show t'}-                else if c' /= c-                then failed {reason = "found valid, but converts " ++ show c ++ " -> " ++ show t' ++ " -> " ++ show c'}-                else succeeded-        else case mt of-            Nothing -> if c' /= c-                then succeeded-                else failed {reason = show c ++ " found invalid, but converts with " ++ show t'}-            Just _ -> rejected--validTest :: (Arbitrary c,Eq c,Show c,Eq t,Show t) =>-    String -> (t -> c) -> (c -> t) -> (c -> Maybe t) -> Test-validTest name toComponents fromComponents fromComponentsValid = testGroup name-    [-    testProperty "valid" $ property $ validResult True toComponents fromComponents fromComponentsValid,-    testProperty "invalid" $ property $ validResult False toComponents fromComponents fromComponentsValid-    ]--toSundayStartWeek :: Day -> (Integer,Int,Int)-toSundayStartWeek day = let-    (y,_) = toOrdinalDate day-    (m,d) = sundayStartWeek day-    in (y,m,d)--toMondayStartWeek :: Day -> (Integer,Int,Int)-toMondayStartWeek day = let-    (y,_) = toOrdinalDate day-    (m,d) = mondayStartWeek day-    in (y,m,d)--testValid :: Test-testValid = testGroup "testValid"-    [-    validTest "Gregorian" toGregorian (\(y,m,d) -> fromGregorian y m d) (\(y,m,d) -> fromGregorianValid y m d),-    validTest "OrdinalDate" toOrdinalDate (\(y,d) -> fromOrdinalDate y d) (\(y,d) -> fromOrdinalDateValid y d),-    validTest "WeekDate" toWeekDate (\(y,m,d) -> fromWeekDate y m d) (\(y,m,d) -> fromWeekDateValid y m d),-    validTest "SundayStartWeek" toSundayStartWeek (\(y,m,d) -> fromSundayStartWeek y m d) (\(y,m,d) -> fromSundayStartWeekValid y m d),-    validTest "MondayStartWeek" toMondayStartWeek (\(y,m,d) -> fromMondayStartWeek y m d) (\(y,m,d) -> fromMondayStartWeekValid y m d),-    validTest "Julian" toJulian (\(y,m,d) -> fromJulian y m d) (\(y,m,d) -> fromJulianValid y m d)-    ]
− test/Test/Tests.hs
@@ -1,32 +0,0 @@-module Test.Tests where--import Test.Framework--import Test.AddDays-import Test.ClipDates-import Test.ConvertBack-import Test.LongWeekYears-import Test.TestCalendars-import Test.TestEaster-import Test.TestFormat-import Test.TestMonthDay-import Test.TestParseTime-import Test.TestTAI-import Test.TestTime-import Test.TestTimeZone-import Test.TestValid--tests :: [Test]-tests = [ addDaysTest-        , clipDates-        , convertBack-        , longWeekYears-        , testCalendars-        , testEaster-        , testFormat-        , testMonthDay-        , testParseTime-        , testTAI-        , testTime-        , testTimeZone-        , testValid ]
+ test/main/Main.hs view
@@ -0,0 +1,52 @@+module Main where++import Foreign.C.Types+import Test.Tasty+import Test.Calendar.AddDays+import Test.Calendar.Calendars+import Test.Calendar.ClipDates+import Test.Calendar.ConvertBack+import Test.Calendar.Easter+import Test.Calendar.LongWeekYears+import Test.Calendar.MonthDay+import Test.Calendar.Valid+import Test.Clock.Conversion+import Test.Clock.Resolution+import Test.Clock.TAI+import Test.Format.Format+import Test.Format.ParseTime+import Test.LocalTime.Time+++tests :: TestTree+tests = testGroup "Time" [+    testGroup "Calendar" [+        addDaysTest,+        testCalendars,+        clipDates,+        convertBack,+        longWeekYears,+        testMonthDay,+        testEaster,+        testValid+        ],+    testGroup "Clock" [+        testClockConversion,+        testResolutions,+        testTAI+        ],+    testGroup "Format" [+        testFormat,+        testParseTime+        ],+    testGroup "LocalTime" [+        testTime+        ]+    ]++main :: IO ()+main = do+  if (toRational (1000000000000 :: CTime)) /= (1000000000000 :: Rational)+    then putStrLn "WARNING: Some tests will incorrectly fail due to a 32-bit time_t C type."+    else return ()+  defaultMain tests
+ test/main/Test/Calendar/AddDays.hs view
@@ -0,0 +1,42 @@+module Test.Calendar.AddDays(addDaysTest) where++import Data.Time.Calendar+import Test.Tasty+import Test.Tasty.HUnit+import Test.Calendar.AddDaysRef++days ::[Day]+days =+    [+    fromGregorian 2005 2 28,+    fromGregorian 2004 2 29,+    fromGregorian 2004 1 31,+    fromGregorian 2004 12 31,+    fromGregorian 2005 7 1,+    fromGregorian 2005 4 21,+    fromGregorian 2005 6 30+    ]++increments :: [Integer]+increments = [-10,-4,-1,0,1,7,83]++adders :: [(String,Integer -> Day -> Day)]+adders =+    [+    ("day",addDays),+    ("month (clip)",addGregorianMonthsClip),+    ("month (roll over)",addGregorianMonthsRollOver),+    ("year (clip)",addGregorianYearsClip),+    ("year (roll over)",addGregorianYearsRollOver)+    ]++resultDays :: [String]+resultDays = do+    (aname,adder) <- adders+    increment <- increments+    day <- days+    return ((showGregorian day) ++ " + " ++ (show increment) ++ " * " ++ aname ++ " = " ++ showGregorian (adder increment day))++addDaysTest :: TestTree+addDaysTest = testCase "addDays" $+    assertEqual "" addDaysRef $ unlines resultDays
+ test/main/Test/Calendar/AddDaysRef.hs view
@@ -0,0 +1,250 @@+module Test.Calendar.AddDaysRef where++addDaysRef :: String+addDaysRef =+ unlines+  [ "2005-02-28 + -10 * day = 2005-02-18"+  , "2004-02-29 + -10 * day = 2004-02-19"+  , "2004-01-31 + -10 * day = 2004-01-21"+  , "2004-12-31 + -10 * day = 2004-12-21"+  , "2005-07-01 + -10 * day = 2005-06-21"+  , "2005-04-21 + -10 * day = 2005-04-11"+  , "2005-06-30 + -10 * day = 2005-06-20"+  , "2005-02-28 + -4 * day = 2005-02-24"+  , "2004-02-29 + -4 * day = 2004-02-25"+  , "2004-01-31 + -4 * day = 2004-01-27"+  , "2004-12-31 + -4 * day = 2004-12-27"+  , "2005-07-01 + -4 * day = 2005-06-27"+  , "2005-04-21 + -4 * day = 2005-04-17"+  , "2005-06-30 + -4 * day = 2005-06-26"+  , "2005-02-28 + -1 * day = 2005-02-27"+  , "2004-02-29 + -1 * day = 2004-02-28"+  , "2004-01-31 + -1 * day = 2004-01-30"+  , "2004-12-31 + -1 * day = 2004-12-30"+  , "2005-07-01 + -1 * day = 2005-06-30"+  , "2005-04-21 + -1 * day = 2005-04-20"+  , "2005-06-30 + -1 * day = 2005-06-29"+  , "2005-02-28 + 0 * day = 2005-02-28"+  , "2004-02-29 + 0 * day = 2004-02-29"+  , "2004-01-31 + 0 * day = 2004-01-31"+  , "2004-12-31 + 0 * day = 2004-12-31"+  , "2005-07-01 + 0 * day = 2005-07-01"+  , "2005-04-21 + 0 * day = 2005-04-21"+  , "2005-06-30 + 0 * day = 2005-06-30"+  , "2005-02-28 + 1 * day = 2005-03-01"+  , "2004-02-29 + 1 * day = 2004-03-01"+  , "2004-01-31 + 1 * day = 2004-02-01"+  , "2004-12-31 + 1 * day = 2005-01-01"+  , "2005-07-01 + 1 * day = 2005-07-02"+  , "2005-04-21 + 1 * day = 2005-04-22"+  , "2005-06-30 + 1 * day = 2005-07-01"+  , "2005-02-28 + 7 * day = 2005-03-07"+  , "2004-02-29 + 7 * day = 2004-03-07"+  , "2004-01-31 + 7 * day = 2004-02-07"+  , "2004-12-31 + 7 * day = 2005-01-07"+  , "2005-07-01 + 7 * day = 2005-07-08"+  , "2005-04-21 + 7 * day = 2005-04-28"+  , "2005-06-30 + 7 * day = 2005-07-07"+  , "2005-02-28 + 83 * day = 2005-05-22"+  , "2004-02-29 + 83 * day = 2004-05-22"+  , "2004-01-31 + 83 * day = 2004-04-23"+  , "2004-12-31 + 83 * day = 2005-03-24"+  , "2005-07-01 + 83 * day = 2005-09-22"+  , "2005-04-21 + 83 * day = 2005-07-13"+  , "2005-06-30 + 83 * day = 2005-09-21"+  , "2005-02-28 + -10 * month (clip) = 2004-04-28"+  , "2004-02-29 + -10 * month (clip) = 2003-04-29"+  , "2004-01-31 + -10 * month (clip) = 2003-03-31"+  , "2004-12-31 + -10 * month (clip) = 2004-02-29"+  , "2005-07-01 + -10 * month (clip) = 2004-09-01"+  , "2005-04-21 + -10 * month (clip) = 2004-06-21"+  , "2005-06-30 + -10 * month (clip) = 2004-08-30"+  , "2005-02-28 + -4 * month (clip) = 2004-10-28"+  , "2004-02-29 + -4 * month (clip) = 2003-10-29"+  , "2004-01-31 + -4 * month (clip) = 2003-09-30"+  , "2004-12-31 + -4 * month (clip) = 2004-08-31"+  , "2005-07-01 + -4 * month (clip) = 2005-03-01"+  , "2005-04-21 + -4 * month (clip) = 2004-12-21"+  , "2005-06-30 + -4 * month (clip) = 2005-02-28"+  , "2005-02-28 + -1 * month (clip) = 2005-01-28"+  , "2004-02-29 + -1 * month (clip) = 2004-01-29"+  , "2004-01-31 + -1 * month (clip) = 2003-12-31"+  , "2004-12-31 + -1 * month (clip) = 2004-11-30"+  , "2005-07-01 + -1 * month (clip) = 2005-06-01"+  , "2005-04-21 + -1 * month (clip) = 2005-03-21"+  , "2005-06-30 + -1 * month (clip) = 2005-05-30"+  , "2005-02-28 + 0 * month (clip) = 2005-02-28"+  , "2004-02-29 + 0 * month (clip) = 2004-02-29"+  , "2004-01-31 + 0 * month (clip) = 2004-01-31"+  , "2004-12-31 + 0 * month (clip) = 2004-12-31"+  , "2005-07-01 + 0 * month (clip) = 2005-07-01"+  , "2005-04-21 + 0 * month (clip) = 2005-04-21"+  , "2005-06-30 + 0 * month (clip) = 2005-06-30"+  , "2005-02-28 + 1 * month (clip) = 2005-03-28"+  , "2004-02-29 + 1 * month (clip) = 2004-03-29"+  , "2004-01-31 + 1 * month (clip) = 2004-02-29"+  , "2004-12-31 + 1 * month (clip) = 2005-01-31"+  , "2005-07-01 + 1 * month (clip) = 2005-08-01"+  , "2005-04-21 + 1 * month (clip) = 2005-05-21"+  , "2005-06-30 + 1 * month (clip) = 2005-07-30"+  , "2005-02-28 + 7 * month (clip) = 2005-09-28"+  , "2004-02-29 + 7 * month (clip) = 2004-09-29"+  , "2004-01-31 + 7 * month (clip) = 2004-08-31"+  , "2004-12-31 + 7 * month (clip) = 2005-07-31"+  , "2005-07-01 + 7 * month (clip) = 2006-02-01"+  , "2005-04-21 + 7 * month (clip) = 2005-11-21"+  , "2005-06-30 + 7 * month (clip) = 2006-01-30"+  , "2005-02-28 + 83 * month (clip) = 2012-01-28"+  , "2004-02-29 + 83 * month (clip) = 2011-01-29"+  , "2004-01-31 + 83 * month (clip) = 2010-12-31"+  , "2004-12-31 + 83 * month (clip) = 2011-11-30"+  , "2005-07-01 + 83 * month (clip) = 2012-06-01"+  , "2005-04-21 + 83 * month (clip) = 2012-03-21"+  , "2005-06-30 + 83 * month (clip) = 2012-05-30"+  , "2005-02-28 + -10 * month (roll over) = 2004-04-28"+  , "2004-02-29 + -10 * month (roll over) = 2003-04-29"+  , "2004-01-31 + -10 * month (roll over) = 2003-03-31"+  , "2004-12-31 + -10 * month (roll over) = 2004-03-02"+  , "2005-07-01 + -10 * month (roll over) = 2004-09-01"+  , "2005-04-21 + -10 * month (roll over) = 2004-06-21"+  , "2005-06-30 + -10 * month (roll over) = 2004-08-30"+  , "2005-02-28 + -4 * month (roll over) = 2004-10-28"+  , "2004-02-29 + -4 * month (roll over) = 2003-10-29"+  , "2004-01-31 + -4 * month (roll over) = 2003-10-01"+  , "2004-12-31 + -4 * month (roll over) = 2004-08-31"+  , "2005-07-01 + -4 * month (roll over) = 2005-03-01"+  , "2005-04-21 + -4 * month (roll over) = 2004-12-21"+  , "2005-06-30 + -4 * month (roll over) = 2005-03-02"+  , "2005-02-28 + -1 * month (roll over) = 2005-01-28"+  , "2004-02-29 + -1 * month (roll over) = 2004-01-29"+  , "2004-01-31 + -1 * month (roll over) = 2003-12-31"+  , "2004-12-31 + -1 * month (roll over) = 2004-12-01"+  , "2005-07-01 + -1 * month (roll over) = 2005-06-01"+  , "2005-04-21 + -1 * month (roll over) = 2005-03-21"+  , "2005-06-30 + -1 * month (roll over) = 2005-05-30"+  , "2005-02-28 + 0 * month (roll over) = 2005-02-28"+  , "2004-02-29 + 0 * month (roll over) = 2004-02-29"+  , "2004-01-31 + 0 * month (roll over) = 2004-01-31"+  , "2004-12-31 + 0 * month (roll over) = 2004-12-31"+  , "2005-07-01 + 0 * month (roll over) = 2005-07-01"+  , "2005-04-21 + 0 * month (roll over) = 2005-04-21"+  , "2005-06-30 + 0 * month (roll over) = 2005-06-30"+  , "2005-02-28 + 1 * month (roll over) = 2005-03-28"+  , "2004-02-29 + 1 * month (roll over) = 2004-03-29"+  , "2004-01-31 + 1 * month (roll over) = 2004-03-02"+  , "2004-12-31 + 1 * month (roll over) = 2005-01-31"+  , "2005-07-01 + 1 * month (roll over) = 2005-08-01"+  , "2005-04-21 + 1 * month (roll over) = 2005-05-21"+  , "2005-06-30 + 1 * month (roll over) = 2005-07-30"+  , "2005-02-28 + 7 * month (roll over) = 2005-09-28"+  , "2004-02-29 + 7 * month (roll over) = 2004-09-29"+  , "2004-01-31 + 7 * month (roll over) = 2004-08-31"+  , "2004-12-31 + 7 * month (roll over) = 2005-07-31"+  , "2005-07-01 + 7 * month (roll over) = 2006-02-01"+  , "2005-04-21 + 7 * month (roll over) = 2005-11-21"+  , "2005-06-30 + 7 * month (roll over) = 2006-01-30"+  , "2005-02-28 + 83 * month (roll over) = 2012-01-28"+  , "2004-02-29 + 83 * month (roll over) = 2011-01-29"+  , "2004-01-31 + 83 * month (roll over) = 2010-12-31"+  , "2004-12-31 + 83 * month (roll over) = 2011-12-01"+  , "2005-07-01 + 83 * month (roll over) = 2012-06-01"+  , "2005-04-21 + 83 * month (roll over) = 2012-03-21"+  , "2005-06-30 + 83 * month (roll over) = 2012-05-30"+  , "2005-02-28 + -10 * year (clip) = 1995-02-28"+  , "2004-02-29 + -10 * year (clip) = 1994-02-28"+  , "2004-01-31 + -10 * year (clip) = 1994-01-31"+  , "2004-12-31 + -10 * year (clip) = 1994-12-31"+  , "2005-07-01 + -10 * year (clip) = 1995-07-01"+  , "2005-04-21 + -10 * year (clip) = 1995-04-21"+  , "2005-06-30 + -10 * year (clip) = 1995-06-30"+  , "2005-02-28 + -4 * year (clip) = 2001-02-28"+  , "2004-02-29 + -4 * year (clip) = 2000-02-29"+  , "2004-01-31 + -4 * year (clip) = 2000-01-31"+  , "2004-12-31 + -4 * year (clip) = 2000-12-31"+  , "2005-07-01 + -4 * year (clip) = 2001-07-01"+  , "2005-04-21 + -4 * year (clip) = 2001-04-21"+  , "2005-06-30 + -4 * year (clip) = 2001-06-30"+  , "2005-02-28 + -1 * year (clip) = 2004-02-28"+  , "2004-02-29 + -1 * year (clip) = 2003-02-28"+  , "2004-01-31 + -1 * year (clip) = 2003-01-31"+  , "2004-12-31 + -1 * year (clip) = 2003-12-31"+  , "2005-07-01 + -1 * year (clip) = 2004-07-01"+  , "2005-04-21 + -1 * year (clip) = 2004-04-21"+  , "2005-06-30 + -1 * year (clip) = 2004-06-30"+  , "2005-02-28 + 0 * year (clip) = 2005-02-28"+  , "2004-02-29 + 0 * year (clip) = 2004-02-29"+  , "2004-01-31 + 0 * year (clip) = 2004-01-31"+  , "2004-12-31 + 0 * year (clip) = 2004-12-31"+  , "2005-07-01 + 0 * year (clip) = 2005-07-01"+  , "2005-04-21 + 0 * year (clip) = 2005-04-21"+  , "2005-06-30 + 0 * year (clip) = 2005-06-30"+  , "2005-02-28 + 1 * year (clip) = 2006-02-28"+  , "2004-02-29 + 1 * year (clip) = 2005-02-28"+  , "2004-01-31 + 1 * year (clip) = 2005-01-31"+  , "2004-12-31 + 1 * year (clip) = 2005-12-31"+  , "2005-07-01 + 1 * year (clip) = 2006-07-01"+  , "2005-04-21 + 1 * year (clip) = 2006-04-21"+  , "2005-06-30 + 1 * year (clip) = 2006-06-30"+  , "2005-02-28 + 7 * year (clip) = 2012-02-28"+  , "2004-02-29 + 7 * year (clip) = 2011-02-28"+  , "2004-01-31 + 7 * year (clip) = 2011-01-31"+  , "2004-12-31 + 7 * year (clip) = 2011-12-31"+  , "2005-07-01 + 7 * year (clip) = 2012-07-01"+  , "2005-04-21 + 7 * year (clip) = 2012-04-21"+  , "2005-06-30 + 7 * year (clip) = 2012-06-30"+  , "2005-02-28 + 83 * year (clip) = 2088-02-28"+  , "2004-02-29 + 83 * year (clip) = 2087-02-28"+  , "2004-01-31 + 83 * year (clip) = 2087-01-31"+  , "2004-12-31 + 83 * year (clip) = 2087-12-31"+  , "2005-07-01 + 83 * year (clip) = 2088-07-01"+  , "2005-04-21 + 83 * year (clip) = 2088-04-21"+  , "2005-06-30 + 83 * year (clip) = 2088-06-30"+  , "2005-02-28 + -10 * year (roll over) = 1995-02-28"+  , "2004-02-29 + -10 * year (roll over) = 1994-03-01"+  , "2004-01-31 + -10 * year (roll over) = 1994-01-31"+  , "2004-12-31 + -10 * year (roll over) = 1994-12-31"+  , "2005-07-01 + -10 * year (roll over) = 1995-07-01"+  , "2005-04-21 + -10 * year (roll over) = 1995-04-21"+  , "2005-06-30 + -10 * year (roll over) = 1995-06-30"+  , "2005-02-28 + -4 * year (roll over) = 2001-02-28"+  , "2004-02-29 + -4 * year (roll over) = 2000-02-29"+  , "2004-01-31 + -4 * year (roll over) = 2000-01-31"+  , "2004-12-31 + -4 * year (roll over) = 2000-12-31"+  , "2005-07-01 + -4 * year (roll over) = 2001-07-01"+  , "2005-04-21 + -4 * year (roll over) = 2001-04-21"+  , "2005-06-30 + -4 * year (roll over) = 2001-06-30"+  , "2005-02-28 + -1 * year (roll over) = 2004-02-28"+  , "2004-02-29 + -1 * year (roll over) = 2003-03-01"+  , "2004-01-31 + -1 * year (roll over) = 2003-01-31"+  , "2004-12-31 + -1 * year (roll over) = 2003-12-31"+  , "2005-07-01 + -1 * year (roll over) = 2004-07-01"+  , "2005-04-21 + -1 * year (roll over) = 2004-04-21"+  , "2005-06-30 + -1 * year (roll over) = 2004-06-30"+  , "2005-02-28 + 0 * year (roll over) = 2005-02-28"+  , "2004-02-29 + 0 * year (roll over) = 2004-02-29"+  , "2004-01-31 + 0 * year (roll over) = 2004-01-31"+  , "2004-12-31 + 0 * year (roll over) = 2004-12-31"+  , "2005-07-01 + 0 * year (roll over) = 2005-07-01"+  , "2005-04-21 + 0 * year (roll over) = 2005-04-21"+  , "2005-06-30 + 0 * year (roll over) = 2005-06-30"+  , "2005-02-28 + 1 * year (roll over) = 2006-02-28"+  , "2004-02-29 + 1 * year (roll over) = 2005-03-01"+  , "2004-01-31 + 1 * year (roll over) = 2005-01-31"+  , "2004-12-31 + 1 * year (roll over) = 2005-12-31"+  , "2005-07-01 + 1 * year (roll over) = 2006-07-01"+  , "2005-04-21 + 1 * year (roll over) = 2006-04-21"+  , "2005-06-30 + 1 * year (roll over) = 2006-06-30"+  , "2005-02-28 + 7 * year (roll over) = 2012-02-28"+  , "2004-02-29 + 7 * year (roll over) = 2011-03-01"+  , "2004-01-31 + 7 * year (roll over) = 2011-01-31"+  , "2004-12-31 + 7 * year (roll over) = 2011-12-31"+  , "2005-07-01 + 7 * year (roll over) = 2012-07-01"+  , "2005-04-21 + 7 * year (roll over) = 2012-04-21"+  , "2005-06-30 + 7 * year (roll over) = 2012-06-30"+  , "2005-02-28 + 83 * year (roll over) = 2088-02-28"+  , "2004-02-29 + 83 * year (roll over) = 2087-03-01"+  , "2004-01-31 + 83 * year (roll over) = 2087-01-31"+  , "2004-12-31 + 83 * year (roll over) = 2087-12-31"+  , "2005-07-01 + 83 * year (roll over) = 2088-07-01"+  , "2005-04-21 + 83 * year (roll over) = 2088-04-21"+  , "2005-06-30 + 83 * year (roll over) = 2088-06-30" ]
+ test/main/Test/Calendar/Calendars.hs view
@@ -0,0 +1,31 @@+module Test.Calendar.Calendars(testCalendars) where++import Data.Time.Calendar.Julian+import Data.Time.Calendar.WeekDate+import Data.Time.Calendar+import Test.Tasty+import Test.Tasty.HUnit+import Test.Calendar.CalendarsRef++showers :: [(String,Day -> String)]+showers = [+    ("MJD",show . toModifiedJulianDay),+    ("Gregorian",showGregorian),+    ("Julian",showJulian),+    ("ISO 8601",showWeekDate)+    ]++days :: [Day]+days = [+    fromGregorian 0 12 31,+    fromJulian 1752 9 2,+    fromGregorian 1752 9 14,+    fromGregorian 2005 1 23+    ]++testCalendars :: TestTree+testCalendars = testCase "testCalendars" $+    assertEqual "" testCalendarsRef $ unlines $ map (\d -> showShowers d) days+  where+    showShowers day =+        concatMap (\(nm,shower) -> unwords [" ==", nm, shower day]) showers
+ test/main/Test/Calendar/CalendarsRef.hs view
@@ -0,0 +1,9 @@+module Test.Calendar.CalendarsRef where++testCalendarsRef :: String+testCalendarsRef =+ unlines+  [ " == MJD -678576 == Gregorian 0000-12-31 == Julian 0001-01-02 == ISO 8601 0000-W52-7"+  , " == MJD -38780 == Gregorian 1752-09-13 == Julian 1752-09-02 == ISO 8601 1752-W37-3"+  , " == MJD -38779 == Gregorian 1752-09-14 == Julian 1752-09-03 == ISO 8601 1752-W37-4"+  , " == MJD 53393 == Gregorian 2005-01-23 == Julian 2005-01-10 == ISO 8601 2005-W03-7" ]
+ test/main/Test/Calendar/ClipDates.hs view
@@ -0,0 +1,47 @@+{-# Language TupleSections #-}++module Test.Calendar.ClipDates(clipDates) where++import Data.Time.Calendar.OrdinalDate+import Data.Time.Calendar.WeekDate+import Data.Time.Calendar+import Test.Tasty+import Test.Tasty.HUnit+import Test.Calendar.ClipDatesRef++yearAndDay :: (Integer,Int) -> String+yearAndDay (y,d) = (show y) ++ "-" ++ (show d) ++ " = " ++ (showOrdinalDate (fromOrdinalDate y d))++gregorian :: (Integer,Int,Int) -> String+gregorian (y,m,d) = (show y) ++ "-" ++ (show m) ++ "-" ++ (show d) ++ " = " ++ (showGregorian (fromGregorian y m d))++iSOWeekDay :: (Integer,Int,Int) -> String+iSOWeekDay (y,w,d) = (show y) ++ "-W" ++ (show w) ++ "-" ++ (show d) ++ " = " ++ (showWeekDate (fromWeekDate y w d))++--++tupleUp2 :: [a] -> [b] -> [(a, b)]+tupleUp2 l1 l2 = concatMap (\e -> map (e,) l2) l1++tupleUp3 :: [a] -> [b] -> [c] -> [(a, b, c)]+tupleUp3 l1 l2 l3+  = let ts = tupleUp2 l2 l3+    in concatMap (\e -> map (\(f, g) -> (e, f, g)) ts) l1++--++clipDates :: TestTree+clipDates = testCase "clipDates" $+    let+        yad  = unlines $ map yearAndDay $+            tupleUp2 [1968,1969,1971] [-4,0,1,200,364,365,366,367,700]+++        greg = unlines $ map gregorian $+            tupleUp3 [1968,1969,1971] [-20,-1,0,1,2,12,13,17] [-7,-1,0,1,2,27,28,29,30,31,32,40]++        iso  = unlines $ map iSOWeekDay $+            tupleUp3 [1968,1969,2004] [-20,-1,0,1,20,51,52,53,54] [-2,-1,0,1,4,6,7,8,9]++    in assertEqual "" clipDatesRef $+        concat [ "YearAndDay\n", yad, "Gregorian\n", greg, "ISOWeekDay\n", iso ]
+ test/main/Test/Calendar/ClipDatesRef.hs view
@@ -0,0 +1,566 @@+module Test.Calendar.ClipDatesRef where++clipDatesRef :: String+clipDatesRef =+ unlines+  [ "YearAndDay"+  , "1968--4 = 1968-001"+  , "1968-0 = 1968-001"+  , "1968-1 = 1968-001"+  , "1968-200 = 1968-200"+  , "1968-364 = 1968-364"+  , "1968-365 = 1968-365"+  , "1968-366 = 1968-366"+  , "1968-367 = 1968-366"+  , "1968-700 = 1968-366"+  , "1969--4 = 1969-001"+  , "1969-0 = 1969-001"+  , "1969-1 = 1969-001"+  , "1969-200 = 1969-200"+  , "1969-364 = 1969-364"+  , "1969-365 = 1969-365"+  , "1969-366 = 1969-365"+  , "1969-367 = 1969-365"+  , "1969-700 = 1969-365"+  , "1971--4 = 1971-001"+  , "1971-0 = 1971-001"+  , "1971-1 = 1971-001"+  , "1971-200 = 1971-200"+  , "1971-364 = 1971-364"+  , "1971-365 = 1971-365"+  , "1971-366 = 1971-365"+  , "1971-367 = 1971-365"+  , "1971-700 = 1971-365"+  , "Gregorian"+  , "1968--20--7 = 1968-01-01"+  , "1968--20--1 = 1968-01-01"+  , "1968--20-0 = 1968-01-01"+  , "1968--20-1 = 1968-01-01"+  , "1968--20-2 = 1968-01-02"+  , "1968--20-27 = 1968-01-27"+  , "1968--20-28 = 1968-01-28"+  , "1968--20-29 = 1968-01-29"+  , "1968--20-30 = 1968-01-30"+  , "1968--20-31 = 1968-01-31"+  , "1968--20-32 = 1968-01-31"+  , "1968--20-40 = 1968-01-31"+  , "1968--1--7 = 1968-01-01"+  , "1968--1--1 = 1968-01-01"+  , "1968--1-0 = 1968-01-01"+  , "1968--1-1 = 1968-01-01"+  , "1968--1-2 = 1968-01-02"+  , "1968--1-27 = 1968-01-27"+  , "1968--1-28 = 1968-01-28"+  , "1968--1-29 = 1968-01-29"+  , "1968--1-30 = 1968-01-30"+  , "1968--1-31 = 1968-01-31"+  , "1968--1-32 = 1968-01-31"+  , "1968--1-40 = 1968-01-31"+  , "1968-0--7 = 1968-01-01"+  , "1968-0--1 = 1968-01-01"+  , "1968-0-0 = 1968-01-01"+  , "1968-0-1 = 1968-01-01"+  , "1968-0-2 = 1968-01-02"+  , "1968-0-27 = 1968-01-27"+  , "1968-0-28 = 1968-01-28"+  , "1968-0-29 = 1968-01-29"+  , "1968-0-30 = 1968-01-30"+  , "1968-0-31 = 1968-01-31"+  , "1968-0-32 = 1968-01-31"+  , "1968-0-40 = 1968-01-31"+  , "1968-1--7 = 1968-01-01"+  , "1968-1--1 = 1968-01-01"+  , "1968-1-0 = 1968-01-01"+  , "1968-1-1 = 1968-01-01"+  , "1968-1-2 = 1968-01-02"+  , "1968-1-27 = 1968-01-27"+  , "1968-1-28 = 1968-01-28"+  , "1968-1-29 = 1968-01-29"+  , "1968-1-30 = 1968-01-30"+  , "1968-1-31 = 1968-01-31"+  , "1968-1-32 = 1968-01-31"+  , "1968-1-40 = 1968-01-31"+  , "1968-2--7 = 1968-02-01"+  , "1968-2--1 = 1968-02-01"+  , "1968-2-0 = 1968-02-01"+  , "1968-2-1 = 1968-02-01"+  , "1968-2-2 = 1968-02-02"+  , "1968-2-27 = 1968-02-27"+  , "1968-2-28 = 1968-02-28"+  , "1968-2-29 = 1968-02-29"+  , "1968-2-30 = 1968-02-29"+  , "1968-2-31 = 1968-02-29"+  , "1968-2-32 = 1968-02-29"+  , "1968-2-40 = 1968-02-29"+  , "1968-12--7 = 1968-12-01"+  , "1968-12--1 = 1968-12-01"+  , "1968-12-0 = 1968-12-01"+  , "1968-12-1 = 1968-12-01"+  , "1968-12-2 = 1968-12-02"+  , "1968-12-27 = 1968-12-27"+  , "1968-12-28 = 1968-12-28"+  , "1968-12-29 = 1968-12-29"+  , "1968-12-30 = 1968-12-30"+  , "1968-12-31 = 1968-12-31"+  , "1968-12-32 = 1968-12-31"+  , "1968-12-40 = 1968-12-31"+  , "1968-13--7 = 1968-12-01"+  , "1968-13--1 = 1968-12-01"+  , "1968-13-0 = 1968-12-01"+  , "1968-13-1 = 1968-12-01"+  , "1968-13-2 = 1968-12-02"+  , "1968-13-27 = 1968-12-27"+  , "1968-13-28 = 1968-12-28"+  , "1968-13-29 = 1968-12-29"+  , "1968-13-30 = 1968-12-30"+  , "1968-13-31 = 1968-12-31"+  , "1968-13-32 = 1968-12-31"+  , "1968-13-40 = 1968-12-31"+  , "1968-17--7 = 1968-12-01"+  , "1968-17--1 = 1968-12-01"+  , "1968-17-0 = 1968-12-01"+  , "1968-17-1 = 1968-12-01"+  , "1968-17-2 = 1968-12-02"+  , "1968-17-27 = 1968-12-27"+  , "1968-17-28 = 1968-12-28"+  , "1968-17-29 = 1968-12-29"+  , "1968-17-30 = 1968-12-30"+  , "1968-17-31 = 1968-12-31"+  , "1968-17-32 = 1968-12-31"+  , "1968-17-40 = 1968-12-31"+  , "1969--20--7 = 1969-01-01"+  , "1969--20--1 = 1969-01-01"+  , "1969--20-0 = 1969-01-01"+  , "1969--20-1 = 1969-01-01"+  , "1969--20-2 = 1969-01-02"+  , "1969--20-27 = 1969-01-27"+  , "1969--20-28 = 1969-01-28"+  , "1969--20-29 = 1969-01-29"+  , "1969--20-30 = 1969-01-30"+  , "1969--20-31 = 1969-01-31"+  , "1969--20-32 = 1969-01-31"+  , "1969--20-40 = 1969-01-31"+  , "1969--1--7 = 1969-01-01"+  , "1969--1--1 = 1969-01-01"+  , "1969--1-0 = 1969-01-01"+  , "1969--1-1 = 1969-01-01"+  , "1969--1-2 = 1969-01-02"+  , "1969--1-27 = 1969-01-27"+  , "1969--1-28 = 1969-01-28"+  , "1969--1-29 = 1969-01-29"+  , "1969--1-30 = 1969-01-30"+  , "1969--1-31 = 1969-01-31"+  , "1969--1-32 = 1969-01-31"+  , "1969--1-40 = 1969-01-31"+  , "1969-0--7 = 1969-01-01"+  , "1969-0--1 = 1969-01-01"+  , "1969-0-0 = 1969-01-01"+  , "1969-0-1 = 1969-01-01"+  , "1969-0-2 = 1969-01-02"+  , "1969-0-27 = 1969-01-27"+  , "1969-0-28 = 1969-01-28"+  , "1969-0-29 = 1969-01-29"+  , "1969-0-30 = 1969-01-30"+  , "1969-0-31 = 1969-01-31"+  , "1969-0-32 = 1969-01-31"+  , "1969-0-40 = 1969-01-31"+  , "1969-1--7 = 1969-01-01"+  , "1969-1--1 = 1969-01-01"+  , "1969-1-0 = 1969-01-01"+  , "1969-1-1 = 1969-01-01"+  , "1969-1-2 = 1969-01-02"+  , "1969-1-27 = 1969-01-27"+  , "1969-1-28 = 1969-01-28"+  , "1969-1-29 = 1969-01-29"+  , "1969-1-30 = 1969-01-30"+  , "1969-1-31 = 1969-01-31"+  , "1969-1-32 = 1969-01-31"+  , "1969-1-40 = 1969-01-31"+  , "1969-2--7 = 1969-02-01"+  , "1969-2--1 = 1969-02-01"+  , "1969-2-0 = 1969-02-01"+  , "1969-2-1 = 1969-02-01"+  , "1969-2-2 = 1969-02-02"+  , "1969-2-27 = 1969-02-27"+  , "1969-2-28 = 1969-02-28"+  , "1969-2-29 = 1969-02-28"+  , "1969-2-30 = 1969-02-28"+  , "1969-2-31 = 1969-02-28"+  , "1969-2-32 = 1969-02-28"+  , "1969-2-40 = 1969-02-28"+  , "1969-12--7 = 1969-12-01"+  , "1969-12--1 = 1969-12-01"+  , "1969-12-0 = 1969-12-01"+  , "1969-12-1 = 1969-12-01"+  , "1969-12-2 = 1969-12-02"+  , "1969-12-27 = 1969-12-27"+  , "1969-12-28 = 1969-12-28"+  , "1969-12-29 = 1969-12-29"+  , "1969-12-30 = 1969-12-30"+  , "1969-12-31 = 1969-12-31"+  , "1969-12-32 = 1969-12-31"+  , "1969-12-40 = 1969-12-31"+  , "1969-13--7 = 1969-12-01"+  , "1969-13--1 = 1969-12-01"+  , "1969-13-0 = 1969-12-01"+  , "1969-13-1 = 1969-12-01"+  , "1969-13-2 = 1969-12-02"+  , "1969-13-27 = 1969-12-27"+  , "1969-13-28 = 1969-12-28"+  , "1969-13-29 = 1969-12-29"+  , "1969-13-30 = 1969-12-30"+  , "1969-13-31 = 1969-12-31"+  , "1969-13-32 = 1969-12-31"+  , "1969-13-40 = 1969-12-31"+  , "1969-17--7 = 1969-12-01"+  , "1969-17--1 = 1969-12-01"+  , "1969-17-0 = 1969-12-01"+  , "1969-17-1 = 1969-12-01"+  , "1969-17-2 = 1969-12-02"+  , "1969-17-27 = 1969-12-27"+  , "1969-17-28 = 1969-12-28"+  , "1969-17-29 = 1969-12-29"+  , "1969-17-30 = 1969-12-30"+  , "1969-17-31 = 1969-12-31"+  , "1969-17-32 = 1969-12-31"+  , "1969-17-40 = 1969-12-31"+  , "1971--20--7 = 1971-01-01"+  , "1971--20--1 = 1971-01-01"+  , "1971--20-0 = 1971-01-01"+  , "1971--20-1 = 1971-01-01"+  , "1971--20-2 = 1971-01-02"+  , "1971--20-27 = 1971-01-27"+  , "1971--20-28 = 1971-01-28"+  , "1971--20-29 = 1971-01-29"+  , "1971--20-30 = 1971-01-30"+  , "1971--20-31 = 1971-01-31"+  , "1971--20-32 = 1971-01-31"+  , "1971--20-40 = 1971-01-31"+  , "1971--1--7 = 1971-01-01"+  , "1971--1--1 = 1971-01-01"+  , "1971--1-0 = 1971-01-01"+  , "1971--1-1 = 1971-01-01"+  , "1971--1-2 = 1971-01-02"+  , "1971--1-27 = 1971-01-27"+  , "1971--1-28 = 1971-01-28"+  , "1971--1-29 = 1971-01-29"+  , "1971--1-30 = 1971-01-30"+  , "1971--1-31 = 1971-01-31"+  , "1971--1-32 = 1971-01-31"+  , "1971--1-40 = 1971-01-31"+  , "1971-0--7 = 1971-01-01"+  , "1971-0--1 = 1971-01-01"+  , "1971-0-0 = 1971-01-01"+  , "1971-0-1 = 1971-01-01"+  , "1971-0-2 = 1971-01-02"+  , "1971-0-27 = 1971-01-27"+  , "1971-0-28 = 1971-01-28"+  , "1971-0-29 = 1971-01-29"+  , "1971-0-30 = 1971-01-30"+  , "1971-0-31 = 1971-01-31"+  , "1971-0-32 = 1971-01-31"+  , "1971-0-40 = 1971-01-31"+  , "1971-1--7 = 1971-01-01"+  , "1971-1--1 = 1971-01-01"+  , "1971-1-0 = 1971-01-01"+  , "1971-1-1 = 1971-01-01"+  , "1971-1-2 = 1971-01-02"+  , "1971-1-27 = 1971-01-27"+  , "1971-1-28 = 1971-01-28"+  , "1971-1-29 = 1971-01-29"+  , "1971-1-30 = 1971-01-30"+  , "1971-1-31 = 1971-01-31"+  , "1971-1-32 = 1971-01-31"+  , "1971-1-40 = 1971-01-31"+  , "1971-2--7 = 1971-02-01"+  , "1971-2--1 = 1971-02-01"+  , "1971-2-0 = 1971-02-01"+  , "1971-2-1 = 1971-02-01"+  , "1971-2-2 = 1971-02-02"+  , "1971-2-27 = 1971-02-27"+  , "1971-2-28 = 1971-02-28"+  , "1971-2-29 = 1971-02-28"+  , "1971-2-30 = 1971-02-28"+  , "1971-2-31 = 1971-02-28"+  , "1971-2-32 = 1971-02-28"+  , "1971-2-40 = 1971-02-28"+  , "1971-12--7 = 1971-12-01"+  , "1971-12--1 = 1971-12-01"+  , "1971-12-0 = 1971-12-01"+  , "1971-12-1 = 1971-12-01"+  , "1971-12-2 = 1971-12-02"+  , "1971-12-27 = 1971-12-27"+  , "1971-12-28 = 1971-12-28"+  , "1971-12-29 = 1971-12-29"+  , "1971-12-30 = 1971-12-30"+  , "1971-12-31 = 1971-12-31"+  , "1971-12-32 = 1971-12-31"+  , "1971-12-40 = 1971-12-31"+  , "1971-13--7 = 1971-12-01"+  , "1971-13--1 = 1971-12-01"+  , "1971-13-0 = 1971-12-01"+  , "1971-13-1 = 1971-12-01"+  , "1971-13-2 = 1971-12-02"+  , "1971-13-27 = 1971-12-27"+  , "1971-13-28 = 1971-12-28"+  , "1971-13-29 = 1971-12-29"+  , "1971-13-30 = 1971-12-30"+  , "1971-13-31 = 1971-12-31"+  , "1971-13-32 = 1971-12-31"+  , "1971-13-40 = 1971-12-31"+  , "1971-17--7 = 1971-12-01"+  , "1971-17--1 = 1971-12-01"+  , "1971-17-0 = 1971-12-01"+  , "1971-17-1 = 1971-12-01"+  , "1971-17-2 = 1971-12-02"+  , "1971-17-27 = 1971-12-27"+  , "1971-17-28 = 1971-12-28"+  , "1971-17-29 = 1971-12-29"+  , "1971-17-30 = 1971-12-30"+  , "1971-17-31 = 1971-12-31"+  , "1971-17-32 = 1971-12-31"+  , "1971-17-40 = 1971-12-31"+  , "ISOWeekDay"+  , "1968-W-20--2 = 1968-W01-1"+  , "1968-W-20--1 = 1968-W01-1"+  , "1968-W-20-0 = 1968-W01-1"+  , "1968-W-20-1 = 1968-W01-1"+  , "1968-W-20-4 = 1968-W01-4"+  , "1968-W-20-6 = 1968-W01-6"+  , "1968-W-20-7 = 1968-W01-7"+  , "1968-W-20-8 = 1968-W01-7"+  , "1968-W-20-9 = 1968-W01-7"+  , "1968-W-1--2 = 1968-W01-1"+  , "1968-W-1--1 = 1968-W01-1"+  , "1968-W-1-0 = 1968-W01-1"+  , "1968-W-1-1 = 1968-W01-1"+  , "1968-W-1-4 = 1968-W01-4"+  , "1968-W-1-6 = 1968-W01-6"+  , "1968-W-1-7 = 1968-W01-7"+  , "1968-W-1-8 = 1968-W01-7"+  , "1968-W-1-9 = 1968-W01-7"+  , "1968-W0--2 = 1968-W01-1"+  , "1968-W0--1 = 1968-W01-1"+  , "1968-W0-0 = 1968-W01-1"+  , "1968-W0-1 = 1968-W01-1"+  , "1968-W0-4 = 1968-W01-4"+  , "1968-W0-6 = 1968-W01-6"+  , "1968-W0-7 = 1968-W01-7"+  , "1968-W0-8 = 1968-W01-7"+  , "1968-W0-9 = 1968-W01-7"+  , "1968-W1--2 = 1968-W01-1"+  , "1968-W1--1 = 1968-W01-1"+  , "1968-W1-0 = 1968-W01-1"+  , "1968-W1-1 = 1968-W01-1"+  , "1968-W1-4 = 1968-W01-4"+  , "1968-W1-6 = 1968-W01-6"+  , "1968-W1-7 = 1968-W01-7"+  , "1968-W1-8 = 1968-W01-7"+  , "1968-W1-9 = 1968-W01-7"+  , "1968-W20--2 = 1968-W20-1"+  , "1968-W20--1 = 1968-W20-1"+  , "1968-W20-0 = 1968-W20-1"+  , "1968-W20-1 = 1968-W20-1"+  , "1968-W20-4 = 1968-W20-4"+  , "1968-W20-6 = 1968-W20-6"+  , "1968-W20-7 = 1968-W20-7"+  , "1968-W20-8 = 1968-W20-7"+  , "1968-W20-9 = 1968-W20-7"+  , "1968-W51--2 = 1968-W51-1"+  , "1968-W51--1 = 1968-W51-1"+  , "1968-W51-0 = 1968-W51-1"+  , "1968-W51-1 = 1968-W51-1"+  , "1968-W51-4 = 1968-W51-4"+  , "1968-W51-6 = 1968-W51-6"+  , "1968-W51-7 = 1968-W51-7"+  , "1968-W51-8 = 1968-W51-7"+  , "1968-W51-9 = 1968-W51-7"+  , "1968-W52--2 = 1968-W52-1"+  , "1968-W52--1 = 1968-W52-1"+  , "1968-W52-0 = 1968-W52-1"+  , "1968-W52-1 = 1968-W52-1"+  , "1968-W52-4 = 1968-W52-4"+  , "1968-W52-6 = 1968-W52-6"+  , "1968-W52-7 = 1968-W52-7"+  , "1968-W52-8 = 1968-W52-7"+  , "1968-W52-9 = 1968-W52-7"+  , "1968-W53--2 = 1968-W52-1"+  , "1968-W53--1 = 1968-W52-1"+  , "1968-W53-0 = 1968-W52-1"+  , "1968-W53-1 = 1968-W52-1"+  , "1968-W53-4 = 1968-W52-4"+  , "1968-W53-6 = 1968-W52-6"+  , "1968-W53-7 = 1968-W52-7"+  , "1968-W53-8 = 1968-W52-7"+  , "1968-W53-9 = 1968-W52-7"+  , "1968-W54--2 = 1968-W52-1"+  , "1968-W54--1 = 1968-W52-1"+  , "1968-W54-0 = 1968-W52-1"+  , "1968-W54-1 = 1968-W52-1"+  , "1968-W54-4 = 1968-W52-4"+  , "1968-W54-6 = 1968-W52-6"+  , "1968-W54-7 = 1968-W52-7"+  , "1968-W54-8 = 1968-W52-7"+  , "1968-W54-9 = 1968-W52-7"+  , "1969-W-20--2 = 1969-W01-1"+  , "1969-W-20--1 = 1969-W01-1"+  , "1969-W-20-0 = 1969-W01-1"+  , "1969-W-20-1 = 1969-W01-1"+  , "1969-W-20-4 = 1969-W01-4"+  , "1969-W-20-6 = 1969-W01-6"+  , "1969-W-20-7 = 1969-W01-7"+  , "1969-W-20-8 = 1969-W01-7"+  , "1969-W-20-9 = 1969-W01-7"+  , "1969-W-1--2 = 1969-W01-1"+  , "1969-W-1--1 = 1969-W01-1"+  , "1969-W-1-0 = 1969-W01-1"+  , "1969-W-1-1 = 1969-W01-1"+  , "1969-W-1-4 = 1969-W01-4"+  , "1969-W-1-6 = 1969-W01-6"+  , "1969-W-1-7 = 1969-W01-7"+  , "1969-W-1-8 = 1969-W01-7"+  , "1969-W-1-9 = 1969-W01-7"+  , "1969-W0--2 = 1969-W01-1"+  , "1969-W0--1 = 1969-W01-1"+  , "1969-W0-0 = 1969-W01-1"+  , "1969-W0-1 = 1969-W01-1"+  , "1969-W0-4 = 1969-W01-4"+  , "1969-W0-6 = 1969-W01-6"+  , "1969-W0-7 = 1969-W01-7"+  , "1969-W0-8 = 1969-W01-7"+  , "1969-W0-9 = 1969-W01-7"+  , "1969-W1--2 = 1969-W01-1"+  , "1969-W1--1 = 1969-W01-1"+  , "1969-W1-0 = 1969-W01-1"+  , "1969-W1-1 = 1969-W01-1"+  , "1969-W1-4 = 1969-W01-4"+  , "1969-W1-6 = 1969-W01-6"+  , "1969-W1-7 = 1969-W01-7"+  , "1969-W1-8 = 1969-W01-7"+  , "1969-W1-9 = 1969-W01-7"+  , "1969-W20--2 = 1969-W20-1"+  , "1969-W20--1 = 1969-W20-1"+  , "1969-W20-0 = 1969-W20-1"+  , "1969-W20-1 = 1969-W20-1"+  , "1969-W20-4 = 1969-W20-4"+  , "1969-W20-6 = 1969-W20-6"+  , "1969-W20-7 = 1969-W20-7"+  , "1969-W20-8 = 1969-W20-7"+  , "1969-W20-9 = 1969-W20-7"+  , "1969-W51--2 = 1969-W51-1"+  , "1969-W51--1 = 1969-W51-1"+  , "1969-W51-0 = 1969-W51-1"+  , "1969-W51-1 = 1969-W51-1"+  , "1969-W51-4 = 1969-W51-4"+  , "1969-W51-6 = 1969-W51-6"+  , "1969-W51-7 = 1969-W51-7"+  , "1969-W51-8 = 1969-W51-7"+  , "1969-W51-9 = 1969-W51-7"+  , "1969-W52--2 = 1969-W52-1"+  , "1969-W52--1 = 1969-W52-1"+  , "1969-W52-0 = 1969-W52-1"+  , "1969-W52-1 = 1969-W52-1"+  , "1969-W52-4 = 1969-W52-4"+  , "1969-W52-6 = 1969-W52-6"+  , "1969-W52-7 = 1969-W52-7"+  , "1969-W52-8 = 1969-W52-7"+  , "1969-W52-9 = 1969-W52-7"+  , "1969-W53--2 = 1969-W52-1"+  , "1969-W53--1 = 1969-W52-1"+  , "1969-W53-0 = 1969-W52-1"+  , "1969-W53-1 = 1969-W52-1"+  , "1969-W53-4 = 1969-W52-4"+  , "1969-W53-6 = 1969-W52-6"+  , "1969-W53-7 = 1969-W52-7"+  , "1969-W53-8 = 1969-W52-7"+  , "1969-W53-9 = 1969-W52-7"+  , "1969-W54--2 = 1969-W52-1"+  , "1969-W54--1 = 1969-W52-1"+  , "1969-W54-0 = 1969-W52-1"+  , "1969-W54-1 = 1969-W52-1"+  , "1969-W54-4 = 1969-W52-4"+  , "1969-W54-6 = 1969-W52-6"+  , "1969-W54-7 = 1969-W52-7"+  , "1969-W54-8 = 1969-W52-7"+  , "1969-W54-9 = 1969-W52-7"+  , "2004-W-20--2 = 2004-W01-1"+  , "2004-W-20--1 = 2004-W01-1"+  , "2004-W-20-0 = 2004-W01-1"+  , "2004-W-20-1 = 2004-W01-1"+  , "2004-W-20-4 = 2004-W01-4"+  , "2004-W-20-6 = 2004-W01-6"+  , "2004-W-20-7 = 2004-W01-7"+  , "2004-W-20-8 = 2004-W01-7"+  , "2004-W-20-9 = 2004-W01-7"+  , "2004-W-1--2 = 2004-W01-1"+  , "2004-W-1--1 = 2004-W01-1"+  , "2004-W-1-0 = 2004-W01-1"+  , "2004-W-1-1 = 2004-W01-1"+  , "2004-W-1-4 = 2004-W01-4"+  , "2004-W-1-6 = 2004-W01-6"+  , "2004-W-1-7 = 2004-W01-7"+  , "2004-W-1-8 = 2004-W01-7"+  , "2004-W-1-9 = 2004-W01-7"+  , "2004-W0--2 = 2004-W01-1"+  , "2004-W0--1 = 2004-W01-1"+  , "2004-W0-0 = 2004-W01-1"+  , "2004-W0-1 = 2004-W01-1"+  , "2004-W0-4 = 2004-W01-4"+  , "2004-W0-6 = 2004-W01-6"+  , "2004-W0-7 = 2004-W01-7"+  , "2004-W0-8 = 2004-W01-7"+  , "2004-W0-9 = 2004-W01-7"+  , "2004-W1--2 = 2004-W01-1"+  , "2004-W1--1 = 2004-W01-1"+  , "2004-W1-0 = 2004-W01-1"+  , "2004-W1-1 = 2004-W01-1"+  , "2004-W1-4 = 2004-W01-4"+  , "2004-W1-6 = 2004-W01-6"+  , "2004-W1-7 = 2004-W01-7"+  , "2004-W1-8 = 2004-W01-7"+  , "2004-W1-9 = 2004-W01-7"+  , "2004-W20--2 = 2004-W20-1"+  , "2004-W20--1 = 2004-W20-1"+  , "2004-W20-0 = 2004-W20-1"+  , "2004-W20-1 = 2004-W20-1"+  , "2004-W20-4 = 2004-W20-4"+  , "2004-W20-6 = 2004-W20-6"+  , "2004-W20-7 = 2004-W20-7"+  , "2004-W20-8 = 2004-W20-7"+  , "2004-W20-9 = 2004-W20-7"+  , "2004-W51--2 = 2004-W51-1"+  , "2004-W51--1 = 2004-W51-1"+  , "2004-W51-0 = 2004-W51-1"+  , "2004-W51-1 = 2004-W51-1"+  , "2004-W51-4 = 2004-W51-4"+  , "2004-W51-6 = 2004-W51-6"+  , "2004-W51-7 = 2004-W51-7"+  , "2004-W51-8 = 2004-W51-7"+  , "2004-W51-9 = 2004-W51-7"+  , "2004-W52--2 = 2004-W52-1"+  , "2004-W52--1 = 2004-W52-1"+  , "2004-W52-0 = 2004-W52-1"+  , "2004-W52-1 = 2004-W52-1"+  , "2004-W52-4 = 2004-W52-4"+  , "2004-W52-6 = 2004-W52-6"+  , "2004-W52-7 = 2004-W52-7"+  , "2004-W52-8 = 2004-W52-7"+  , "2004-W52-9 = 2004-W52-7"+  , "2004-W53--2 = 2004-W53-1"+  , "2004-W53--1 = 2004-W53-1"+  , "2004-W53-0 = 2004-W53-1"+  , "2004-W53-1 = 2004-W53-1"+  , "2004-W53-4 = 2004-W53-4"+  , "2004-W53-6 = 2004-W53-6"+  , "2004-W53-7 = 2004-W53-7"+  , "2004-W53-8 = 2004-W53-7"+  , "2004-W53-9 = 2004-W53-7"+  , "2004-W54--2 = 2004-W53-1"+  , "2004-W54--1 = 2004-W53-1"+  , "2004-W54-0 = 2004-W53-1"+  , "2004-W54-1 = 2004-W53-1"+  , "2004-W54-4 = 2004-W53-4"+  , "2004-W54-6 = 2004-W53-6"+  , "2004-W54-7 = 2004-W53-7"+  , "2004-W54-8 = 2004-W53-7"+  , "2004-W54-9 = 2004-W53-7" ]
+ test/main/Test/Calendar/ConvertBack.hs view
@@ -0,0 +1,41 @@+module Test.Calendar.ConvertBack(convertBack) where++import Data.Time.Calendar.OrdinalDate+import Data.Time.Calendar.Julian+import Data.Time.Calendar.WeekDate+import Data.Time.Calendar+import Test.Tasty+import Test.Tasty.HUnit++checkDay :: (Show t) => (Day -> t) -> (t -> Day) -> (t -> Maybe Day) -> Day -> String+checkDay encodeDay decodeDay decodeDayValid day = let+    st    = encodeDay day+    day'  = decodeDay st+    mday' = decodeDayValid st++    a = if day /= day'+          then unwords [ show day, "-> "+                           , show st,  "-> "+                           , show day'+                           , "(diff", show (diffDays day' day) ++ ")" ]+          else ""++    b = if Just day /= mday'+          then unwords [show day, "->", show st, "->", show mday']+          else ""+    in a ++ b++checkers :: [Day -> String]+checkers+  = [ checkDay toOrdinalDate (\(y,d) -> fromOrdinalDate y d) (\(y,d) -> fromOrdinalDateValid y d)+    , checkDay toWeekDate (\(y,w,d) -> fromWeekDate y w d) (\(y,w,d) -> fromWeekDateValid y w d)+    , checkDay toGregorian (\(y,m,d) -> fromGregorian y m d) (\(y,m,d) -> fromGregorianValid y m d)+    , checkDay toJulian (\(y,m,d) -> fromJulian y m d) (\(y,m,d) -> fromJulianValid y m d) ]++days :: [Day]+days = [ModifiedJulianDay 50000 .. ModifiedJulianDay 50200] +++    (fmap (\year -> (fromGregorian year 1 4)) [1980..2000])++convertBack :: TestTree+convertBack = testCase "convertBack" $+    assertEqual "" "" $ concatMap (\ch -> concatMap ch days) checkers
+ test/main/Test/Calendar/Easter.hs view
@@ -0,0 +1,37 @@+{-# OPTIONS -Wall -Werror #-}++module Test.Calendar.Easter(testEaster) where++import Data.Time.Calendar.Easter+import Data.Time.Calendar+import Data.Time.Format++import Test.Tasty+import Test.Tasty.HUnit+import Test.Calendar.EasterRef++--++days :: [Day]+days = [ModifiedJulianDay 53000 .. ModifiedJulianDay 53014]++showWithWDay :: Day -> String+showWithWDay = formatTime defaultTimeLocale "%F %A"++testEaster :: TestTree+testEaster = testCase "testEaster" $ let+    ds = unlines $ map (\day ->+                   unwords [ showWithWDay day, "->"+                           , showWithWDay (sundayAfter day)]) days++    f y = unwords [ show y ++ ", Gregorian: moon,"+                          , show (gregorianPaschalMoon y) ++ ": Easter,"+                          , showWithWDay (gregorianEaster y)]+                  ++ "\n"++    g y = unwords [ show y ++ ", Orthodox : moon,"+                          , show (orthodoxPaschalMoon y) ++ ": Easter,"+                          , showWithWDay (orthodoxEaster y)]+                  ++ "\n"++    in assertEqual "" testEasterRef $ ds ++ concatMap (\y -> f y ++ g y) [2000..2020]
+ test/main/Test/Calendar/EasterRef.hs view
@@ -0,0 +1,62 @@+module Test.Calendar.EasterRef where++testEasterRef :: String+testEasterRef =+ unlines+  [ "2003-12-27 Saturday -> 2003-12-28 Sunday"+  , "2003-12-28 Sunday -> 2004-01-04 Sunday"+  , "2003-12-29 Monday -> 2004-01-04 Sunday"+  , "2003-12-30 Tuesday -> 2004-01-04 Sunday"+  , "2003-12-31 Wednesday -> 2004-01-04 Sunday"+  , "2004-01-01 Thursday -> 2004-01-04 Sunday"+  , "2004-01-02 Friday -> 2004-01-04 Sunday"+  , "2004-01-03 Saturday -> 2004-01-04 Sunday"+  , "2004-01-04 Sunday -> 2004-01-11 Sunday"+  , "2004-01-05 Monday -> 2004-01-11 Sunday"+  , "2004-01-06 Tuesday -> 2004-01-11 Sunday"+  , "2004-01-07 Wednesday -> 2004-01-11 Sunday"+  , "2004-01-08 Thursday -> 2004-01-11 Sunday"+  , "2004-01-09 Friday -> 2004-01-11 Sunday"+  , "2004-01-10 Saturday -> 2004-01-11 Sunday"+  , "2000, Gregorian: moon, 2000-04-18: Easter, 2000-04-23 Sunday"+  , "2000, Orthodox : moon, 2000-04-23: Easter, 2000-04-30 Sunday"+  , "2001, Gregorian: moon, 2001-04-08: Easter, 2001-04-15 Sunday"+  , "2001, Orthodox : moon, 2001-04-12: Easter, 2001-04-15 Sunday"+  , "2002, Gregorian: moon, 2002-03-28: Easter, 2002-03-31 Sunday"+  , "2002, Orthodox : moon, 2002-05-01: Easter, 2002-05-05 Sunday"+  , "2003, Gregorian: moon, 2003-04-16: Easter, 2003-04-20 Sunday"+  , "2003, Orthodox : moon, 2003-04-20: Easter, 2003-04-27 Sunday"+  , "2004, Gregorian: moon, 2004-04-05: Easter, 2004-04-11 Sunday"+  , "2004, Orthodox : moon, 2004-04-09: Easter, 2004-04-11 Sunday"+  , "2005, Gregorian: moon, 2005-03-25: Easter, 2005-03-27 Sunday"+  , "2005, Orthodox : moon, 2005-04-28: Easter, 2005-05-01 Sunday"+  , "2006, Gregorian: moon, 2006-04-13: Easter, 2006-04-16 Sunday"+  , "2006, Orthodox : moon, 2006-04-17: Easter, 2006-04-23 Sunday"+  , "2007, Gregorian: moon, 2007-04-02: Easter, 2007-04-08 Sunday"+  , "2007, Orthodox : moon, 2007-04-06: Easter, 2007-04-08 Sunday"+  , "2008, Gregorian: moon, 2008-03-22: Easter, 2008-03-23 Sunday"+  , "2008, Orthodox : moon, 2008-04-25: Easter, 2008-04-27 Sunday"+  , "2009, Gregorian: moon, 2009-04-10: Easter, 2009-04-12 Sunday"+  , "2009, Orthodox : moon, 2009-04-14: Easter, 2009-04-19 Sunday"+  , "2010, Gregorian: moon, 2010-03-30: Easter, 2010-04-04 Sunday"+  , "2010, Orthodox : moon, 2010-04-03: Easter, 2010-04-04 Sunday"+  , "2011, Gregorian: moon, 2011-04-18: Easter, 2011-04-24 Sunday"+  , "2011, Orthodox : moon, 2011-04-22: Easter, 2011-04-24 Sunday"+  , "2012, Gregorian: moon, 2012-04-07: Easter, 2012-04-08 Sunday"+  , "2012, Orthodox : moon, 2012-04-11: Easter, 2012-04-15 Sunday"+  , "2013, Gregorian: moon, 2013-03-27: Easter, 2013-03-31 Sunday"+  , "2013, Orthodox : moon, 2013-04-30: Easter, 2013-05-05 Sunday"+  , "2014, Gregorian: moon, 2014-04-14: Easter, 2014-04-20 Sunday"+  , "2014, Orthodox : moon, 2014-04-18: Easter, 2014-04-20 Sunday"+  , "2015, Gregorian: moon, 2015-04-03: Easter, 2015-04-05 Sunday"+  , "2015, Orthodox : moon, 2015-04-07: Easter, 2015-04-12 Sunday"+  , "2016, Gregorian: moon, 2016-03-23: Easter, 2016-03-27 Sunday"+  , "2016, Orthodox : moon, 2016-04-26: Easter, 2016-05-01 Sunday"+  , "2017, Gregorian: moon, 2017-04-11: Easter, 2017-04-16 Sunday"+  , "2017, Orthodox : moon, 2017-04-15: Easter, 2017-04-16 Sunday"+  , "2018, Gregorian: moon, 2018-03-31: Easter, 2018-04-01 Sunday"+  , "2018, Orthodox : moon, 2018-04-04: Easter, 2018-04-08 Sunday"+  , "2019, Gregorian: moon, 2019-04-18: Easter, 2019-04-21 Sunday"+  , "2019, Orthodox : moon, 2019-04-23: Easter, 2019-04-28 Sunday"+  , "2020, Gregorian: moon, 2020-04-08: Easter, 2020-04-12 Sunday"+  , "2020, Orthodox : moon, 2020-04-12: Easter, 2020-04-19 Sunday" ]
+ test/main/Test/Calendar/LongWeekYears.hs view
@@ -0,0 +1,21 @@+module Test.Calendar.LongWeekYears(longWeekYears) where++import Data.Time.Calendar.WeekDate+import Data.Time.Calendar+import Test.Tasty+import Test.Tasty.HUnit+import Test.Calendar.LongWeekYearsRef++longYear :: Integer -> Bool+longYear year = case toWeekDate (fromGregorian year 12 31) of+    (_,53,_) -> True+    _ -> False++showLongYear :: Integer -> String+showLongYear year+  = unwords [ show year ++ ":"+            , (if isLeapYear year then "L" else " ") ++ (if longYear year then "*" else " ") ]++longWeekYears :: TestTree+longWeekYears = testCase "longWeekYears" $+    assertEqual "" longWeekYearsRef $ unlines $ map showLongYear [1901 .. 2050]
+ test/main/Test/Calendar/LongWeekYearsRef.hs view
@@ -0,0 +1,155 @@+module Test.Calendar.LongWeekYearsRef where++longWeekYearsRef :: String+longWeekYearsRef =+ unlines+  [ "1901:   "+  , "1902:   "+  , "1903:  *"+  , "1904: L "+  , "1905:   "+  , "1906:   "+  , "1907:   "+  , "1908: L*"+  , "1909:   "+  , "1910:   "+  , "1911:   "+  , "1912: L "+  , "1913:   "+  , "1914:  *"+  , "1915:   "+  , "1916: L "+  , "1917:   "+  , "1918:   "+  , "1919:   "+  , "1920: L*"+  , "1921:   "+  , "1922:   "+  , "1923:   "+  , "1924: L "+  , "1925:  *"+  , "1926:   "+  , "1927:   "+  , "1928: L "+  , "1929:   "+  , "1930:   "+  , "1931:  *"+  , "1932: L "+  , "1933:   "+  , "1934:   "+  , "1935:   "+  , "1936: L*"+  , "1937:   "+  , "1938:   "+  , "1939:   "+  , "1940: L "+  , "1941:   "+  , "1942:  *"+  , "1943:   "+  , "1944: L "+  , "1945:   "+  , "1946:   "+  , "1947:   "+  , "1948: L*"+  , "1949:   "+  , "1950:   "+  , "1951:   "+  , "1952: L "+  , "1953:  *"+  , "1954:   "+  , "1955:   "+  , "1956: L "+  , "1957:   "+  , "1958:   "+  , "1959:  *"+  , "1960: L "+  , "1961:   "+  , "1962:   "+  , "1963:   "+  , "1964: L*"+  , "1965:   "+  , "1966:   "+  , "1967:   "+  , "1968: L "+  , "1969:   "+  , "1970:  *"+  , "1971:   "+  , "1972: L "+  , "1973:   "+  , "1974:   "+  , "1975:   "+  , "1976: L*"+  , "1977:   "+  , "1978:   "+  , "1979:   "+  , "1980: L "+  , "1981:  *"+  , "1982:   "+  , "1983:   "+  , "1984: L "+  , "1985:   "+  , "1986:   "+  , "1987:  *"+  , "1988: L "+  , "1989:   "+  , "1990:   "+  , "1991:   "+  , "1992: L*"+  , "1993:   "+  , "1994:   "+  , "1995:   "+  , "1996: L "+  , "1997:   "+  , "1998:  *"+  , "1999:   "+  , "2000: L "+  , "2001:   "+  , "2002:   "+  , "2003:   "+  , "2004: L*"+  , "2005:   "+  , "2006:   "+  , "2007:   "+  , "2008: L "+  , "2009:  *"+  , "2010:   "+  , "2011:   "+  , "2012: L "+  , "2013:   "+  , "2014:   "+  , "2015:  *"+  , "2016: L "+  , "2017:   "+  , "2018:   "+  , "2019:   "+  , "2020: L*"+  , "2021:   "+  , "2022:   "+  , "2023:   "+  , "2024: L "+  , "2025:   "+  , "2026:  *"+  , "2027:   "+  , "2028: L "+  , "2029:   "+  , "2030:   "+  , "2031:   "+  , "2032: L*"+  , "2033:   "+  , "2034:   "+  , "2035:   "+  , "2036: L "+  , "2037:  *"+  , "2038:   "+  , "2039:   "+  , "2040: L "+  , "2041:   "+  , "2042:   "+  , "2043:  *"+  , "2044: L "+  , "2045:   "+  , "2046:   "+  , "2047:   "+  , "2048: L*"+  , "2049:   "+  , "2050:   " ]
+ test/main/Test/Calendar/MonthDay.hs view
@@ -0,0 +1,23 @@+module Test.Calendar.MonthDay(testMonthDay) where++import Data.Time.Calendar.MonthDay+import Test.Tasty+import Test.Tasty.HUnit+import Test.Calendar.MonthDayRef++showCompare :: (Eq a,Show a) => a -> String -> a -> String+showCompare a1 b a2 | a1 == a2 = (show a1) ++ " == " ++ b+showCompare a1 b a2 = "DIFF: " ++ (show a1) ++ " -> " ++ b ++ " -> " ++ (show a2)++testMonthDay :: TestTree+testMonthDay = testCase "testMonthDay" $+    assertEqual "" testMonthDayRef $ concat $ map (\isL -> unlines (leap isL : yearDays isL)) [False,True]+    where+        leap isLeap = if isLeap then "Leap:" else "Regular:"+        yearDays isLeap =+            map (\yd -> let+                (m,d)  = dayOfYearToMonthAndDay isLeap yd+                yd'    = monthAndDayToDayOfYear isLeap m d+                mdtext = show m ++ "-" ++ show d+            in showCompare yd mdtext yd')+            [-2..369]
+ test/main/Test/Calendar/MonthDayRef.hs view
@@ -0,0 +1,751 @@+module Test.Calendar.MonthDayRef where++testMonthDayRef :: String+testMonthDayRef =+ unlines+  [ "Regular:"+  , "DIFF: -2 -> 1-1 -> 1"+  , "DIFF: -1 -> 1-1 -> 1"+  , "DIFF: 0 -> 1-1 -> 1"+  , "1 == 1-1"+  , "2 == 1-2"+  , "3 == 1-3"+  , "4 == 1-4"+  , "5 == 1-5"+  , "6 == 1-6"+  , "7 == 1-7"+  , "8 == 1-8"+  , "9 == 1-9"+  , "10 == 1-10"+  , "11 == 1-11"+  , "12 == 1-12"+  , "13 == 1-13"+  , "14 == 1-14"+  , "15 == 1-15"+  , "16 == 1-16"+  , "17 == 1-17"+  , "18 == 1-18"+  , "19 == 1-19"+  , "20 == 1-20"+  , "21 == 1-21"+  , "22 == 1-22"+  , "23 == 1-23"+  , "24 == 1-24"+  , "25 == 1-25"+  , "26 == 1-26"+  , "27 == 1-27"+  , "28 == 1-28"+  , "29 == 1-29"+  , "30 == 1-30"+  , "31 == 1-31"+  , "32 == 2-1"+  , "33 == 2-2"+  , "34 == 2-3"+  , "35 == 2-4"+  , "36 == 2-5"+  , "37 == 2-6"+  , "38 == 2-7"+  , "39 == 2-8"+  , "40 == 2-9"+  , "41 == 2-10"+  , "42 == 2-11"+  , "43 == 2-12"+  , "44 == 2-13"+  , "45 == 2-14"+  , "46 == 2-15"+  , "47 == 2-16"+  , "48 == 2-17"+  , "49 == 2-18"+  , "50 == 2-19"+  , "51 == 2-20"+  , "52 == 2-21"+  , "53 == 2-22"+  , "54 == 2-23"+  , "55 == 2-24"+  , "56 == 2-25"+  , "57 == 2-26"+  , "58 == 2-27"+  , "59 == 2-28"+  , "60 == 3-1"+  , "61 == 3-2"+  , "62 == 3-3"+  , "63 == 3-4"+  , "64 == 3-5"+  , "65 == 3-6"+  , "66 == 3-7"+  , "67 == 3-8"+  , "68 == 3-9"+  , "69 == 3-10"+  , "70 == 3-11"+  , "71 == 3-12"+  , "72 == 3-13"+  , "73 == 3-14"+  , "74 == 3-15"+  , "75 == 3-16"+  , "76 == 3-17"+  , "77 == 3-18"+  , "78 == 3-19"+  , "79 == 3-20"+  , "80 == 3-21"+  , "81 == 3-22"+  , "82 == 3-23"+  , "83 == 3-24"+  , "84 == 3-25"+  , "85 == 3-26"+  , "86 == 3-27"+  , "87 == 3-28"+  , "88 == 3-29"+  , "89 == 3-30"+  , "90 == 3-31"+  , "91 == 4-1"+  , "92 == 4-2"+  , "93 == 4-3"+  , "94 == 4-4"+  , "95 == 4-5"+  , "96 == 4-6"+  , "97 == 4-7"+  , "98 == 4-8"+  , "99 == 4-9"+  , "100 == 4-10"+  , "101 == 4-11"+  , "102 == 4-12"+  , "103 == 4-13"+  , "104 == 4-14"+  , "105 == 4-15"+  , "106 == 4-16"+  , "107 == 4-17"+  , "108 == 4-18"+  , "109 == 4-19"+  , "110 == 4-20"+  , "111 == 4-21"+  , "112 == 4-22"+  , "113 == 4-23"+  , "114 == 4-24"+  , "115 == 4-25"+  , "116 == 4-26"+  , "117 == 4-27"+  , "118 == 4-28"+  , "119 == 4-29"+  , "120 == 4-30"+  , "121 == 5-1"+  , "122 == 5-2"+  , "123 == 5-3"+  , "124 == 5-4"+  , "125 == 5-5"+  , "126 == 5-6"+  , "127 == 5-7"+  , "128 == 5-8"+  , "129 == 5-9"+  , "130 == 5-10"+  , "131 == 5-11"+  , "132 == 5-12"+  , "133 == 5-13"+  , "134 == 5-14"+  , "135 == 5-15"+  , "136 == 5-16"+  , "137 == 5-17"+  , "138 == 5-18"+  , "139 == 5-19"+  , "140 == 5-20"+  , "141 == 5-21"+  , "142 == 5-22"+  , "143 == 5-23"+  , "144 == 5-24"+  , "145 == 5-25"+  , "146 == 5-26"+  , "147 == 5-27"+  , "148 == 5-28"+  , "149 == 5-29"+  , "150 == 5-30"+  , "151 == 5-31"+  , "152 == 6-1"+  , "153 == 6-2"+  , "154 == 6-3"+  , "155 == 6-4"+  , "156 == 6-5"+  , "157 == 6-6"+  , "158 == 6-7"+  , "159 == 6-8"+  , "160 == 6-9"+  , "161 == 6-10"+  , "162 == 6-11"+  , "163 == 6-12"+  , "164 == 6-13"+  , "165 == 6-14"+  , "166 == 6-15"+  , "167 == 6-16"+  , "168 == 6-17"+  , "169 == 6-18"+  , "170 == 6-19"+  , "171 == 6-20"+  , "172 == 6-21"+  , "173 == 6-22"+  , "174 == 6-23"+  , "175 == 6-24"+  , "176 == 6-25"+  , "177 == 6-26"+  , "178 == 6-27"+  , "179 == 6-28"+  , "180 == 6-29"+  , "181 == 6-30"+  , "182 == 7-1"+  , "183 == 7-2"+  , "184 == 7-3"+  , "185 == 7-4"+  , "186 == 7-5"+  , "187 == 7-6"+  , "188 == 7-7"+  , "189 == 7-8"+  , "190 == 7-9"+  , "191 == 7-10"+  , "192 == 7-11"+  , "193 == 7-12"+  , "194 == 7-13"+  , "195 == 7-14"+  , "196 == 7-15"+  , "197 == 7-16"+  , "198 == 7-17"+  , "199 == 7-18"+  , "200 == 7-19"+  , "201 == 7-20"+  , "202 == 7-21"+  , "203 == 7-22"+  , "204 == 7-23"+  , "205 == 7-24"+  , "206 == 7-25"+  , "207 == 7-26"+  , "208 == 7-27"+  , "209 == 7-28"+  , "210 == 7-29"+  , "211 == 7-30"+  , "212 == 7-31"+  , "213 == 8-1"+  , "214 == 8-2"+  , "215 == 8-3"+  , "216 == 8-4"+  , "217 == 8-5"+  , "218 == 8-6"+  , "219 == 8-7"+  , "220 == 8-8"+  , "221 == 8-9"+  , "222 == 8-10"+  , "223 == 8-11"+  , "224 == 8-12"+  , "225 == 8-13"+  , "226 == 8-14"+  , "227 == 8-15"+  , "228 == 8-16"+  , "229 == 8-17"+  , "230 == 8-18"+  , "231 == 8-19"+  , "232 == 8-20"+  , "233 == 8-21"+  , "234 == 8-22"+  , "235 == 8-23"+  , "236 == 8-24"+  , "237 == 8-25"+  , "238 == 8-26"+  , "239 == 8-27"+  , "240 == 8-28"+  , "241 == 8-29"+  , "242 == 8-30"+  , "243 == 8-31"+  , "244 == 9-1"+  , "245 == 9-2"+  , "246 == 9-3"+  , "247 == 9-4"+  , "248 == 9-5"+  , "249 == 9-6"+  , "250 == 9-7"+  , "251 == 9-8"+  , "252 == 9-9"+  , "253 == 9-10"+  , "254 == 9-11"+  , "255 == 9-12"+  , "256 == 9-13"+  , "257 == 9-14"+  , "258 == 9-15"+  , "259 == 9-16"+  , "260 == 9-17"+  , "261 == 9-18"+  , "262 == 9-19"+  , "263 == 9-20"+  , "264 == 9-21"+  , "265 == 9-22"+  , "266 == 9-23"+  , "267 == 9-24"+  , "268 == 9-25"+  , "269 == 9-26"+  , "270 == 9-27"+  , "271 == 9-28"+  , "272 == 9-29"+  , "273 == 9-30"+  , "274 == 10-1"+  , "275 == 10-2"+  , "276 == 10-3"+  , "277 == 10-4"+  , "278 == 10-5"+  , "279 == 10-6"+  , "280 == 10-7"+  , "281 == 10-8"+  , "282 == 10-9"+  , "283 == 10-10"+  , "284 == 10-11"+  , "285 == 10-12"+  , "286 == 10-13"+  , "287 == 10-14"+  , "288 == 10-15"+  , "289 == 10-16"+  , "290 == 10-17"+  , "291 == 10-18"+  , "292 == 10-19"+  , "293 == 10-20"+  , "294 == 10-21"+  , "295 == 10-22"+  , "296 == 10-23"+  , "297 == 10-24"+  , "298 == 10-25"+  , "299 == 10-26"+  , "300 == 10-27"+  , "301 == 10-28"+  , "302 == 10-29"+  , "303 == 10-30"+  , "304 == 10-31"+  , "305 == 11-1"+  , "306 == 11-2"+  , "307 == 11-3"+  , "308 == 11-4"+  , "309 == 11-5"+  , "310 == 11-6"+  , "311 == 11-7"+  , "312 == 11-8"+  , "313 == 11-9"+  , "314 == 11-10"+  , "315 == 11-11"+  , "316 == 11-12"+  , "317 == 11-13"+  , "318 == 11-14"+  , "319 == 11-15"+  , "320 == 11-16"+  , "321 == 11-17"+  , "322 == 11-18"+  , "323 == 11-19"+  , "324 == 11-20"+  , "325 == 11-21"+  , "326 == 11-22"+  , "327 == 11-23"+  , "328 == 11-24"+  , "329 == 11-25"+  , "330 == 11-26"+  , "331 == 11-27"+  , "332 == 11-28"+  , "333 == 11-29"+  , "334 == 11-30"+  , "335 == 12-1"+  , "336 == 12-2"+  , "337 == 12-3"+  , "338 == 12-4"+  , "339 == 12-5"+  , "340 == 12-6"+  , "341 == 12-7"+  , "342 == 12-8"+  , "343 == 12-9"+  , "344 == 12-10"+  , "345 == 12-11"+  , "346 == 12-12"+  , "347 == 12-13"+  , "348 == 12-14"+  , "349 == 12-15"+  , "350 == 12-16"+  , "351 == 12-17"+  , "352 == 12-18"+  , "353 == 12-19"+  , "354 == 12-20"+  , "355 == 12-21"+  , "356 == 12-22"+  , "357 == 12-23"+  , "358 == 12-24"+  , "359 == 12-25"+  , "360 == 12-26"+  , "361 == 12-27"+  , "362 == 12-28"+  , "363 == 12-29"+  , "364 == 12-30"+  , "365 == 12-31"+  , "DIFF: 366 -> 12-31 -> 365"+  , "DIFF: 367 -> 12-31 -> 365"+  , "DIFF: 368 -> 12-31 -> 365"+  , "DIFF: 369 -> 12-31 -> 365"+  , "Leap:"+  , "DIFF: -2 -> 1-1 -> 1"+  , "DIFF: -1 -> 1-1 -> 1"+  , "DIFF: 0 -> 1-1 -> 1"+  , "1 == 1-1"+  , "2 == 1-2"+  , "3 == 1-3"+  , "4 == 1-4"+  , "5 == 1-5"+  , "6 == 1-6"+  , "7 == 1-7"+  , "8 == 1-8"+  , "9 == 1-9"+  , "10 == 1-10"+  , "11 == 1-11"+  , "12 == 1-12"+  , "13 == 1-13"+  , "14 == 1-14"+  , "15 == 1-15"+  , "16 == 1-16"+  , "17 == 1-17"+  , "18 == 1-18"+  , "19 == 1-19"+  , "20 == 1-20"+  , "21 == 1-21"+  , "22 == 1-22"+  , "23 == 1-23"+  , "24 == 1-24"+  , "25 == 1-25"+  , "26 == 1-26"+  , "27 == 1-27"+  , "28 == 1-28"+  , "29 == 1-29"+  , "30 == 1-30"+  , "31 == 1-31"+  , "32 == 2-1"+  , "33 == 2-2"+  , "34 == 2-3"+  , "35 == 2-4"+  , "36 == 2-5"+  , "37 == 2-6"+  , "38 == 2-7"+  , "39 == 2-8"+  , "40 == 2-9"+  , "41 == 2-10"+  , "42 == 2-11"+  , "43 == 2-12"+  , "44 == 2-13"+  , "45 == 2-14"+  , "46 == 2-15"+  , "47 == 2-16"+  , "48 == 2-17"+  , "49 == 2-18"+  , "50 == 2-19"+  , "51 == 2-20"+  , "52 == 2-21"+  , "53 == 2-22"+  , "54 == 2-23"+  , "55 == 2-24"+  , "56 == 2-25"+  , "57 == 2-26"+  , "58 == 2-27"+  , "59 == 2-28"+  , "60 == 2-29"+  , "61 == 3-1"+  , "62 == 3-2"+  , "63 == 3-3"+  , "64 == 3-4"+  , "65 == 3-5"+  , "66 == 3-6"+  , "67 == 3-7"+  , "68 == 3-8"+  , "69 == 3-9"+  , "70 == 3-10"+  , "71 == 3-11"+  , "72 == 3-12"+  , "73 == 3-13"+  , "74 == 3-14"+  , "75 == 3-15"+  , "76 == 3-16"+  , "77 == 3-17"+  , "78 == 3-18"+  , "79 == 3-19"+  , "80 == 3-20"+  , "81 == 3-21"+  , "82 == 3-22"+  , "83 == 3-23"+  , "84 == 3-24"+  , "85 == 3-25"+  , "86 == 3-26"+  , "87 == 3-27"+  , "88 == 3-28"+  , "89 == 3-29"+  , "90 == 3-30"+  , "91 == 3-31"+  , "92 == 4-1"+  , "93 == 4-2"+  , "94 == 4-3"+  , "95 == 4-4"+  , "96 == 4-5"+  , "97 == 4-6"+  , "98 == 4-7"+  , "99 == 4-8"+  , "100 == 4-9"+  , "101 == 4-10"+  , "102 == 4-11"+  , "103 == 4-12"+  , "104 == 4-13"+  , "105 == 4-14"+  , "106 == 4-15"+  , "107 == 4-16"+  , "108 == 4-17"+  , "109 == 4-18"+  , "110 == 4-19"+  , "111 == 4-20"+  , "112 == 4-21"+  , "113 == 4-22"+  , "114 == 4-23"+  , "115 == 4-24"+  , "116 == 4-25"+  , "117 == 4-26"+  , "118 == 4-27"+  , "119 == 4-28"+  , "120 == 4-29"+  , "121 == 4-30"+  , "122 == 5-1"+  , "123 == 5-2"+  , "124 == 5-3"+  , "125 == 5-4"+  , "126 == 5-5"+  , "127 == 5-6"+  , "128 == 5-7"+  , "129 == 5-8"+  , "130 == 5-9"+  , "131 == 5-10"+  , "132 == 5-11"+  , "133 == 5-12"+  , "134 == 5-13"+  , "135 == 5-14"+  , "136 == 5-15"+  , "137 == 5-16"+  , "138 == 5-17"+  , "139 == 5-18"+  , "140 == 5-19"+  , "141 == 5-20"+  , "142 == 5-21"+  , "143 == 5-22"+  , "144 == 5-23"+  , "145 == 5-24"+  , "146 == 5-25"+  , "147 == 5-26"+  , "148 == 5-27"+  , "149 == 5-28"+  , "150 == 5-29"+  , "151 == 5-30"+  , "152 == 5-31"+  , "153 == 6-1"+  , "154 == 6-2"+  , "155 == 6-3"+  , "156 == 6-4"+  , "157 == 6-5"+  , "158 == 6-6"+  , "159 == 6-7"+  , "160 == 6-8"+  , "161 == 6-9"+  , "162 == 6-10"+  , "163 == 6-11"+  , "164 == 6-12"+  , "165 == 6-13"+  , "166 == 6-14"+  , "167 == 6-15"+  , "168 == 6-16"+  , "169 == 6-17"+  , "170 == 6-18"+  , "171 == 6-19"+  , "172 == 6-20"+  , "173 == 6-21"+  , "174 == 6-22"+  , "175 == 6-23"+  , "176 == 6-24"+  , "177 == 6-25"+  , "178 == 6-26"+  , "179 == 6-27"+  , "180 == 6-28"+  , "181 == 6-29"+  , "182 == 6-30"+  , "183 == 7-1"+  , "184 == 7-2"+  , "185 == 7-3"+  , "186 == 7-4"+  , "187 == 7-5"+  , "188 == 7-6"+  , "189 == 7-7"+  , "190 == 7-8"+  , "191 == 7-9"+  , "192 == 7-10"+  , "193 == 7-11"+  , "194 == 7-12"+  , "195 == 7-13"+  , "196 == 7-14"+  , "197 == 7-15"+  , "198 == 7-16"+  , "199 == 7-17"+  , "200 == 7-18"+  , "201 == 7-19"+  , "202 == 7-20"+  , "203 == 7-21"+  , "204 == 7-22"+  , "205 == 7-23"+  , "206 == 7-24"+  , "207 == 7-25"+  , "208 == 7-26"+  , "209 == 7-27"+  , "210 == 7-28"+  , "211 == 7-29"+  , "212 == 7-30"+  , "213 == 7-31"+  , "214 == 8-1"+  , "215 == 8-2"+  , "216 == 8-3"+  , "217 == 8-4"+  , "218 == 8-5"+  , "219 == 8-6"+  , "220 == 8-7"+  , "221 == 8-8"+  , "222 == 8-9"+  , "223 == 8-10"+  , "224 == 8-11"+  , "225 == 8-12"+  , "226 == 8-13"+  , "227 == 8-14"+  , "228 == 8-15"+  , "229 == 8-16"+  , "230 == 8-17"+  , "231 == 8-18"+  , "232 == 8-19"+  , "233 == 8-20"+  , "234 == 8-21"+  , "235 == 8-22"+  , "236 == 8-23"+  , "237 == 8-24"+  , "238 == 8-25"+  , "239 == 8-26"+  , "240 == 8-27"+  , "241 == 8-28"+  , "242 == 8-29"+  , "243 == 8-30"+  , "244 == 8-31"+  , "245 == 9-1"+  , "246 == 9-2"+  , "247 == 9-3"+  , "248 == 9-4"+  , "249 == 9-5"+  , "250 == 9-6"+  , "251 == 9-7"+  , "252 == 9-8"+  , "253 == 9-9"+  , "254 == 9-10"+  , "255 == 9-11"+  , "256 == 9-12"+  , "257 == 9-13"+  , "258 == 9-14"+  , "259 == 9-15"+  , "260 == 9-16"+  , "261 == 9-17"+  , "262 == 9-18"+  , "263 == 9-19"+  , "264 == 9-20"+  , "265 == 9-21"+  , "266 == 9-22"+  , "267 == 9-23"+  , "268 == 9-24"+  , "269 == 9-25"+  , "270 == 9-26"+  , "271 == 9-27"+  , "272 == 9-28"+  , "273 == 9-29"+  , "274 == 9-30"+  , "275 == 10-1"+  , "276 == 10-2"+  , "277 == 10-3"+  , "278 == 10-4"+  , "279 == 10-5"+  , "280 == 10-6"+  , "281 == 10-7"+  , "282 == 10-8"+  , "283 == 10-9"+  , "284 == 10-10"+  , "285 == 10-11"+  , "286 == 10-12"+  , "287 == 10-13"+  , "288 == 10-14"+  , "289 == 10-15"+  , "290 == 10-16"+  , "291 == 10-17"+  , "292 == 10-18"+  , "293 == 10-19"+  , "294 == 10-20"+  , "295 == 10-21"+  , "296 == 10-22"+  , "297 == 10-23"+  , "298 == 10-24"+  , "299 == 10-25"+  , "300 == 10-26"+  , "301 == 10-27"+  , "302 == 10-28"+  , "303 == 10-29"+  , "304 == 10-30"+  , "305 == 10-31"+  , "306 == 11-1"+  , "307 == 11-2"+  , "308 == 11-3"+  , "309 == 11-4"+  , "310 == 11-5"+  , "311 == 11-6"+  , "312 == 11-7"+  , "313 == 11-8"+  , "314 == 11-9"+  , "315 == 11-10"+  , "316 == 11-11"+  , "317 == 11-12"+  , "318 == 11-13"+  , "319 == 11-14"+  , "320 == 11-15"+  , "321 == 11-16"+  , "322 == 11-17"+  , "323 == 11-18"+  , "324 == 11-19"+  , "325 == 11-20"+  , "326 == 11-21"+  , "327 == 11-22"+  , "328 == 11-23"+  , "329 == 11-24"+  , "330 == 11-25"+  , "331 == 11-26"+  , "332 == 11-27"+  , "333 == 11-28"+  , "334 == 11-29"+  , "335 == 11-30"+  , "336 == 12-1"+  , "337 == 12-2"+  , "338 == 12-3"+  , "339 == 12-4"+  , "340 == 12-5"+  , "341 == 12-6"+  , "342 == 12-7"+  , "343 == 12-8"+  , "344 == 12-9"+  , "345 == 12-10"+  , "346 == 12-11"+  , "347 == 12-12"+  , "348 == 12-13"+  , "349 == 12-14"+  , "350 == 12-15"+  , "351 == 12-16"+  , "352 == 12-17"+  , "353 == 12-18"+  , "354 == 12-19"+  , "355 == 12-20"+  , "356 == 12-21"+  , "357 == 12-22"+  , "358 == 12-23"+  , "359 == 12-24"+  , "360 == 12-25"+  , "361 == 12-26"+  , "362 == 12-27"+  , "363 == 12-28"+  , "364 == 12-29"+  , "365 == 12-30"+  , "366 == 12-31"+  , "DIFF: 367 -> 12-31 -> 366"+  , "DIFF: 368 -> 12-31 -> 366"+  , "DIFF: 369 -> 12-31 -> 366" ]
+ test/main/Test/Calendar/Valid.hs view
@@ -0,0 +1,95 @@+module Test.Calendar.Valid(testValid) where++import Data.Time+import Data.Time.Calendar.OrdinalDate+import Data.Time.Calendar.WeekDate+import Data.Time.Calendar.Julian+import Test.Tasty+import Test.Tasty.QuickCheck hiding (reason)+import Test.QuickCheck.Property+++validResult :: (Eq c,Show c,Eq t,Show t) =>+    (s -> c) -> Bool -> (t -> c) -> (c -> t) -> (c -> Maybe t) -> s -> Result+validResult sc valid toComponents fromComponents fromComponentsValid s = let+    c = sc s+    mt = fromComponentsValid c+    t' = fromComponents c+    c' = toComponents t'+    in if valid then+        case mt of+            Nothing -> rejected+            Just t -> if t' /= t+                then failed {reason = "'fromValid' gives " ++ show t ++ ", but 'from' gives " ++ show t'}+                else if c' /= c+                then failed {reason = "found valid, but converts " ++ show c ++ " -> " ++ show t' ++ " -> " ++ show c'}+                else succeeded+        else case mt of+            Nothing -> if c' /= c+                then succeeded+                else failed {reason = show c ++ " found invalid, but converts with " ++ show t'}+            Just _ -> rejected++validTest :: (Arbitrary s,Show s,Eq c,Show c,Eq t,Show t) =>+    String -> (s -> c) -> (t -> c) -> (c -> t) -> (c -> Maybe t) -> TestTree+validTest name sc toComponents fromComponents fromComponentsValid = testGroup name+    [+    testProperty "valid" $ property $ validResult sc True toComponents fromComponents fromComponentsValid,+    testProperty "invalid" $ property $ validResult sc False toComponents fromComponents fromComponentsValid+    ]++toSundayStartWeek :: Day -> (Integer,Int,Int)+toSundayStartWeek day = let+    (y,_) = toOrdinalDate day+    (w,d) = sundayStartWeek day+    in (y,w,d)++toMondayStartWeek :: Day -> (Integer,Int,Int)+toMondayStartWeek day = let+    (y,_) = toOrdinalDate day+    (w,d) = mondayStartWeek day+    in (y,w,d)++newtype Year = MkYear Integer deriving (Eq,Show)+instance Arbitrary Year where+    arbitrary = fmap MkYear $ choose (-1000,3000)++newtype YearMonth = MkYearMonth Int deriving (Eq,Show)+instance Arbitrary YearMonth where+    arbitrary = fmap MkYearMonth $ choose (-5,17)++newtype MonthDay = MkMonthDay Int deriving (Eq,Show)+instance Arbitrary MonthDay where+    arbitrary = fmap MkMonthDay $ choose (-5,35)++newtype YearDay = MkYearDay Int deriving (Eq,Show)+instance Arbitrary YearDay where+    arbitrary = fmap MkYearDay $ choose (-20,400)++newtype YearWeek = MkYearWeek Int deriving (Eq,Show)+instance Arbitrary YearWeek where+    arbitrary = fmap MkYearWeek $ choose (-5,60)++newtype WeekDay = MkWeekDay Int deriving (Eq,Show)+instance Arbitrary WeekDay where+    arbitrary = fmap MkWeekDay $ choose (-5,15)++fromYMD :: (Year,YearMonth,MonthDay) -> (Integer,Int,Int)+fromYMD (MkYear y,MkYearMonth ym,MkMonthDay md) = (y,ym,md)++fromYD :: (Year,YearDay) -> (Integer,Int)+fromYD (MkYear y,MkYearDay yd) = (y,yd)++fromYWD :: (Year,YearWeek,WeekDay) -> (Integer,Int,Int)+fromYWD (MkYear y,MkYearWeek yw,MkWeekDay wd) = (y,yw,wd)++testValid :: TestTree+testValid = testGroup "testValid"+    [+    validTest "Gregorian" fromYMD toGregorian (\(y,m,d) -> fromGregorian y m d) (\(y,m,d) -> fromGregorianValid y m d),+    validTest "OrdinalDate" fromYD toOrdinalDate (\(y,d) -> fromOrdinalDate y d) (\(y,d) -> fromOrdinalDateValid y d),+    validTest "WeekDate" fromYWD toWeekDate (\(y,w,d) -> fromWeekDate y w d) (\(y,w,d) -> fromWeekDateValid y w d),+    validTest "SundayStartWeek" fromYWD toSundayStartWeek (\(y,w,d) -> fromSundayStartWeek y w d) (\(y,w,d) -> fromSundayStartWeekValid y w d),+    validTest "MondayStartWeek" fromYWD toMondayStartWeek (\(y,w,d) -> fromMondayStartWeek y w d) (\(y,w,d) -> fromMondayStartWeekValid y w d),+    validTest "Julian" fromYMD toJulian (\(y,m,d) -> fromJulian y m d) (\(y,m,d) -> fromJulianValid y m d)+    ]
+ test/main/Test/Clock/Conversion.hs view
@@ -0,0 +1,25 @@+module Test.Clock.Conversion(testClockConversion) where++import Data.Time.Clock+import Data.Time.Clock.System+import Test.Tasty+import Test.Tasty.HUnit+++testClockConversion :: TestTree;+testClockConversion = testGroup "clock conversion" $ let+    testPair :: (SystemTime,UTCTime) -> TestTree+    testPair (st,ut) = testGroup (show ut) $+        [+            testCase "systemToUTCTime" $ assertEqual (show ut) ut $ systemToUTCTime st,+            testCase "utcToSystemTime" $ assertEqual (show ut) st $ utcToSystemTime ut+        ]+    in+    [+        testPair (MkSystemTime 0 0,UTCTime systemEpochDay 0),+        testPair (MkSystemTime 86399 0,UTCTime systemEpochDay 86399),+        testPair (MkSystemTime 86399 999999999,UTCTime systemEpochDay 86399.999999999),+        testPair (MkSystemTime 86399 1000000000,UTCTime systemEpochDay 86400),+        testPair (MkSystemTime 86399 1999999999,UTCTime systemEpochDay 86400.999999999),+        testPair (MkSystemTime 86400 0,UTCTime (succ systemEpochDay) 0)+    ]
+ test/main/Test/Clock/Resolution.hs view
@@ -0,0 +1,52 @@+module Test.Clock.Resolution(testResolutions) where++import Control.Concurrent+import Data.Fixed+import Data.Time.Clock+import Data.Time.Clock.TAI+import Test.Tasty+import Test.Tasty.HUnit++repeatN :: Monad m => Int -> m a -> m [a]+repeatN 0 _ = return []+repeatN n ma = do+    a <- ma+    aa <- repeatN (n - 1) ma+    return $ a:aa++gcd' :: Real a => a -> a -> a+gcd' a 0 = a+gcd' a b = gcd' b (mod' a b)++gcdAll :: Real a => [a] -> a+gcdAll = foldr gcd' 0++testResolution :: (Show dt,Real dt) => String -> (at -> at -> dt) -> (dt,IO at) -> TestTree+testResolution name timeDiff (res,getTime) = testCase name $ do+    t0 <- getTime+    times0 <- repeatN 100 $ do+        threadDelay 0+        getTime+    times1 <- repeatN 100 $ do -- 100us+        threadDelay 1 -- 1us+        getTime+    times2 <- repeatN 100 $ do -- 1ms+        threadDelay 10 -- 10us+        getTime+    times3 <- repeatN 100 $ do -- 10ms+        threadDelay 100 -- 100us+        getTime+    times4 <- repeatN 100 $ do -- 100ms+        threadDelay 1000 -- 1ms+        getTime+    let times = fmap (\t -> timeDiff t t0) $ times0 ++ times1 ++ times2 ++ times3 ++ times4+    assertEqual "resolution" res $ gcdAll times++testResolutions :: TestTree+testResolutions = testGroup "resolution" $+    [+    testResolution "getCurrentTime" diffUTCTime (realToFrac getTime_resolution,getCurrentTime)+    ]+    ++ case taiClock of+        Just clock -> [testResolution "taiClock" diffAbsoluteTime clock]+        Nothing -> []
+ test/main/Test/Clock/TAI.hs view
@@ -0,0 +1,62 @@+module Test.Clock.TAI(testTAI) where++import Data.Time+import Data.Time.Clock.TAI+import Test.Tasty+import Test.Tasty.HUnit+import Test.TestUtil+++sampleLeapSecondMap :: LeapSecondMap+sampleLeapSecondMap d | d < fromGregorian 1972 1 1 = Nothing+sampleLeapSecondMap d | d < fromGregorian 1972 7 1 = Just 10+sampleLeapSecondMap d | d < fromGregorian 1975 1 1 = Just 11+sampleLeapSecondMap _ = Nothing++testTAI :: TestTree;+testTAI = testGroup "leap second transition" $ let+    dayA = fromGregorian 1972 6 30+    dayB = fromGregorian 1972 7 1++    utcTime1 = UTCTime dayA 86399+    utcTime2 = UTCTime dayA 86400+    utcTime3 = UTCTime dayB 0++    mAbsTime1 = utcToTAITime sampleLeapSecondMap utcTime1+    mAbsTime2 = utcToTAITime sampleLeapSecondMap utcTime2+    mAbsTime3 = utcToTAITime sampleLeapSecondMap utcTime3+    in+    [+        testCase "mapping" $ do+            assertEqual "dayA" (Just 10) $ sampleLeapSecondMap dayA+            assertEqual "dayB" (Just 11) $ sampleLeapSecondMap dayB+        ,+        testCase "day length" $ do+            assertEqual "dayA" (Just 86401) $ utcDayLength sampleLeapSecondMap dayA+            assertEqual "dayB" (Just 86400) $ utcDayLength sampleLeapSecondMap dayB+        ,+        testCase "differences" $ do+            absTime1 <- assertJust mAbsTime1+            absTime2 <- assertJust mAbsTime2+            absTime3 <- assertJust mAbsTime3+            assertEqual "absTime2 - absTime1" 1 $ diffAbsoluteTime absTime2 absTime1+            assertEqual "absTime3 - absTime2" 1 $ diffAbsoluteTime absTime3 absTime2+        ,+        testGroup "round-trip"+        [+            testCase "1" $ do+                absTime <- assertJust mAbsTime1+                utcTime <- assertJust $ taiToUTCTime sampleLeapSecondMap absTime+                assertEqual "round-trip" utcTime1 utcTime+            ,+            testCase "2" $ do+                absTime <- assertJust mAbsTime2+                utcTime <- assertJust $ taiToUTCTime sampleLeapSecondMap absTime+                assertEqual "round-trip" utcTime2 utcTime+            ,+            testCase "3" $ do+                absTime <- assertJust mAbsTime3+                utcTime <- assertJust $ taiToUTCTime sampleLeapSecondMap absTime+                assertEqual "round-trip" utcTime3 utcTime+        ]+    ]
+ test/main/Test/Format/Format.hs view
@@ -0,0 +1,73 @@+module Test.Format.Format(testFormat) where++import Data.Time+import Control.Exception;+import Test.Tasty+import Test.Tasty.HUnit+import Test.TestUtil+++-- as found in http://www.opengroup.org/onlinepubs/007908799/xsh/strftime.html+-- plus FgGklz+-- f not supported+-- P not always supported+-- s time-zone dependent+chars :: [Char]+chars = "aAbBcCdDeFgGhHIjklmMnprRStTuUVwWxXyYzZ%"++-- as found in "man strftime" on a glibc system. '#' is different, though+modifiers :: [Char]+modifiers = "_-0^"++widths :: [String]+widths = ["","1","2","9","12"]++formats :: [String]+formats =  ["%G-W%V-%u","%U-%w","%W-%u"] ++ (fmap (\char -> '%':[char]) chars)+ ++ (concat $ fmap (\char -> concat $ fmap (\width -> fmap (\modifier -> "%" ++ [modifier] ++ width ++ [char]) modifiers) widths) chars)++somestrings :: [String]+somestrings = ["", " ", "-", "\n"]++getBottom :: a -> IO (Maybe Control.Exception.SomeException);+getBottom a = Control.Exception.catch (seq a (return Nothing)) (return . Just);++compareExpected :: (Eq t,Show t,ParseTime t) => String -> String -> String -> Maybe t -> TestTree+compareExpected testname fmt str expected = testCase testname $ do+    let found = parseTimeM False defaultTimeLocale fmt str+    mex <- getBottom found+    case mex of+        Just ex -> assertFailure $ unwords [ "Exception: expected" , show expected ++ ", caught", show ex]+        Nothing -> assertEqual "" expected found++class (ParseTime t) => TestParse t where+    expectedParse :: String -> String -> Maybe t+    expectedParse "%Z" "" = buildTime defaultTimeLocale []+    expectedParse "%_Z" "" = buildTime defaultTimeLocale []+    expectedParse "%-Z" "" = buildTime defaultTimeLocale []+    expectedParse "%0Z" "" = buildTime defaultTimeLocale []+    expectedParse _ _ = Nothing++instance TestParse Day+instance TestParse TimeOfDay+instance TestParse LocalTime+instance TestParse TimeZone+instance TestParse ZonedTime+instance TestParse UTCTime++checkParse :: String -> String -> [TestTree]+checkParse fmt str = [+    compareExpected "Day" fmt str (expectedParse fmt str :: Maybe Day),+    compareExpected "TimeOfDay" fmt str (expectedParse fmt str :: Maybe TimeOfDay),+    compareExpected "LocalTime" fmt str (expectedParse fmt str :: Maybe LocalTime),+    compareExpected "TimeZone" fmt str (expectedParse fmt str :: Maybe TimeZone),+    compareExpected "UTCTime" fmt str (expectedParse fmt str :: Maybe UTCTime)+    ]++testCheckParse :: TestTree+testCheckParse = testGroup "checkParse" $ tgroup formats $ \fmt -> tgroup somestrings $ \str -> checkParse fmt str++testFormat :: TestTree+testFormat = testGroup "testFormat" $ [+    testCheckParse+    ]
+ test/main/Test/Format/ParseTime.hs view
@@ -0,0 +1,561 @@+{-# OPTIONS -fno-warn-type-defaults -fno-warn-orphans #-}+{-# LANGUAGE FlexibleInstances, ExistentialQuantification #-}++module Test.Format.ParseTime(testParseTime,test_parse_format) where++import Control.Monad+import Data.Char+import Data.Ratio+import Data.Time+import Data.Time.Calendar.OrdinalDate+import Data.Time.Calendar.WeekDate+import Data.Time.Clock.POSIX+import Test.QuickCheck.Property+import Test.Tasty+import Test.Tasty.HUnit+import Test.Tasty.QuickCheck hiding (reason)+import Test.TestUtil+++testParseTime :: TestTree+testParseTime = testGroup "testParseTime"+    [+    readOtherTypesTest,+    readTests,+    simpleFormatTests,+    extests,+    particularParseTests,+    badParseTests,+    defaultTimeZoneTests,+    militaryTimeZoneTests,+    propertyTests+    ]++yearDays :: Integer -> [Day]+yearDays y = [(fromGregorian y 1 1) .. (fromGregorian y 12 31)]++makeExhaustiveTest :: String -> [t] -> (t -> TestTree) -> TestTree+makeExhaustiveTest name cases f = testGroup name (fmap f cases)++extests :: TestTree+extests = testGroup "exhaustive" ([+    makeExhaustiveTest "parse %y" [0..99] parseYY,+    makeExhaustiveTest "parse %-C %y 1900s" [0,1,50,99] (parseCYY 19),+    makeExhaustiveTest "parse %-C %y 2000s" [0,1,50,99] (parseCYY 20),+    makeExhaustiveTest "parse %-C %y 1400s" [0,1,50,99] (parseCYY 14),+    makeExhaustiveTest "parse %C %y 0700s" [0,1,50,99] (parseCYY2 7),+    makeExhaustiveTest "parse %-C %y 700s" [0,1,50,99] (parseCYY 7),+    makeExhaustiveTest "parse %-C %y 10000s" [0,1,50,99] (parseCYY 100),+    makeExhaustiveTest "parse %-C centuries" [20..100] (parseCentury " "),+    makeExhaustiveTest "parse %-C century X" [1,10,20,100] (parseCentury "X"),+    makeExhaustiveTest "parse %-C century 2sp" [1,10,20,100] (parseCentury "  "),+    makeExhaustiveTest "parse %-C century 5sp" [1,10,20,100] (parseCentury "     ")+    ] +++    (concat $ fmap+    (\y -> [+    (makeExhaustiveTest "parse %Y%m%d" (yearDays y) parseYMD),+    (makeExhaustiveTest "parse %Y %m %d" (yearDays y) parseYearDayD),+    (makeExhaustiveTest "parse %Y %-m %e" (yearDays y) parseYearDayE)+    ]) [1,4,20,753,2000,2011,10001]))++readTest :: (Eq a,Show a,Read a) => [(a,String)] -> String -> TestTree+readTest expected target = let+    found = reads target+    result = assertEqual "" expected found+    name = show target+    in testCase name result++readTestsParensSpaces :: forall a. (Eq a,Show a,Read a) => a -> String -> TestTree+readTestsParensSpaces expected target = testGroup target+    [+    readTest [(expected,"")] $ target,+    readTest [(expected,"")] $ "("++target++")",+    readTest [(expected,"")] $ " ("++target++")",+    readTest [(expected," ")] $ " ( "++target++" ) ",+    readTest [(expected," ")] $ " (( "++target++" )) ",+    readTest ([] :: [(a,String)]) $ "("++target,+    readTest [(expected,")")] $ ""++target++")",+    readTest [(expected,"")] $ "(("++target++"))",+    readTest [(expected," ")] $ "  (   (     "++target++"   )  ) "+    ] where++readOtherTypesTest :: TestTree+readOtherTypesTest = testGroup "read other types"+    [+    readTestsParensSpaces 3 "3",+    readTestsParensSpaces "a" "\"a\""+    ]++readTests :: TestTree+readTests = testGroup "read times"+    [+    readTestsParensSpaces testDay "1912-07-08",+    --readTestsParensSpaces testDay "1912-7-8",+    readTestsParensSpaces testTimeOfDay "08:04:02"+    --,readTestsParensSpaces testTimeOfDay "8:4:2"+    ] where+    testDay = fromGregorian 1912 7 8+    testTimeOfDay = TimeOfDay 8 4 2++epoch :: LocalTime+epoch = LocalTime (fromGregorian 1970 0 0) midnight++simpleFormatTests :: TestTree+simpleFormatTests = testGroup "simple"+    [+    readsTest [(epoch,"")] "" "",+    readsTest [(epoch," ")] "" " ",+    readsTest [(epoch,"")] " " " ",+    readsTest [(epoch,"")] " " "  ",+    readsTest [(epoch,"")] "%k" "0",+    readsTest [(epoch,"")] "%k" " 0",+    readsTest [(epoch,"")] "%m" "01",+    readsTest [(epoch," ")] "%m" "01 ",+    readsTest [(epoch," ")] " %m" " 01 ",+    readsTest [(epoch,"")] " %m" " 01",+    -- https://ghc.haskell.org/trac/ghc/ticket/9150+    readsTest [(epoch,"")] " %M" " 00",+    readsTest [(epoch,"")] "%M " "00 ",+    readsTest [(epoch,"")] "%Q" "",+    readsTest [(epoch," ")] "%Q" " ",+    readsTest [(epoch,"X")] "%Q" "X",+    readsTest [(epoch," X")] "%Q" " X",+    readsTest [(epoch,"")] "%Q " " ",+    readsTest [(epoch,"")] "%Q X" " X",+    readsTest [(epoch,"")] "%QX" "X"+    ] where+    readsTest :: (Show a, Eq a, ParseTime a) => [(a,String)] -> String -> String -> TestTree+    readsTest expected formatStr target = let+        found = readSTime False defaultTimeLocale formatStr target+        result = assertEqual "" expected found+        name = (show formatStr) ++ " of " ++ (show target)+        in testCase name result++spacingTests :: (Show t, Eq t, ParseTime t) => t -> String -> String -> TestTree+spacingTests expected formatStr target = testGroup "particular"+    [+        parseTest False (Just expected) formatStr target,+        parseTest True (Just expected) formatStr target,+        parseTest False (Just expected) (formatStr ++ " ") (target ++ " "),+        parseTest True (Just expected) (formatStr ++ " ") (target ++ " "),+        parseTest False (Just expected) (" " ++ formatStr) (" " ++ target),+        parseTest True (Just expected) (" " ++ formatStr) (" " ++ target),+        parseTest True (Just expected) ("" ++ formatStr) (" " ++ target),+        parseTest True (Just expected) (" " ++ formatStr) ("  " ++ target)+    ]++particularParseTests :: TestTree+particularParseTests = testGroup "particular"+    [+        spacingTests epoch "%Q" "",+        spacingTests epoch "%Q" ".0",+        spacingTests epoch "%k" " 0",+        spacingTests epoch "%M" "00",+        spacingTests epoch "%m" "01",+        spacingTests (TimeZone 120 False "") "%z" "+0200",+        spacingTests (TimeZone 120 False "") "%Z" "+0200",+        spacingTests (TimeZone (-480) False "PST") "%Z" "PST"+    ]++badParseTests :: TestTree+badParseTests = testGroup "bad"+    [+        parseTest False (Nothing :: Maybe Day) "%Y" ""+    ]++parseYMD :: Day -> TestTree+parseYMD day = case toGregorian day of+    (y,m,d) -> parseTest False (Just day) "%Y%m%d" ((show y) ++ (show2 m) ++ (show2 d))++parseYearDayD :: Day -> TestTree+parseYearDayD day = case toGregorian day of+    (y,m,d) -> parseTest False (Just day) "%Y %m %d" ((show y) ++ " " ++ (show2 m) ++ " " ++ (show2 d))++parseYearDayE :: Day -> TestTree+parseYearDayE day = case toGregorian day of+    (y,m,d) -> parseTest False (Just day) "%Y %-m %e" ((show y) ++ " " ++ (show m) ++ " " ++ (show d))++-- | 1969 - 2068+expectedYear :: Integer -> Integer+expectedYear i | i >= 69 = 1900 + i+expectedYear i = 2000 + i++show2 :: (Show n,Integral n) => n -> String+show2 i = (show (div i 10)) ++ (show (mod i 10))++parseYY :: Integer -> TestTree+parseYY i = parseTest False (Just (fromGregorian (expectedYear i) 1 1)) "%y" (show2 i)++parseCYY :: Integer -> Integer -> TestTree+parseCYY c i = parseTest False (Just (fromGregorian ((c * 100) + i) 1 1)) "%-C %y" ((show c) ++ " " ++ (show2 i))++parseCYY2 :: Integer -> Integer -> TestTree+parseCYY2 c i = parseTest False (Just (fromGregorian ((c * 100) + i) 1 1)) "%C %y" ((show2 c) ++ " " ++ (show2 i))++parseCentury :: String -> Integer -> TestTree+parseCentury int c = parseTest False (Just (fromGregorian (c * 100) 1 1)) ("%-C" ++ int ++ "%y") ((show c) ++ int ++ "00")++parseTest :: (Show t, Eq t, ParseTime t) => Bool -> Maybe t -> String -> String -> TestTree+parseTest sp expected formatStr target = let+    found = parse sp formatStr target+    result = assertEqual "" expected found+    name = (show formatStr) ++ " of " ++ (show target) ++ (if sp then " allowing spaces" else "")+    in testCase name result+{-+readsTest :: forall t. (Show t, Eq t, ParseTime t) => Maybe t -> String -> String -> TestTree+readsTest (Just e) = readsTest' [(e,"")]+readsTest Nothing = readsTest' ([] :: [(t,String)])+-}++enumAdd :: (Enum a) => Int -> a -> a+enumAdd i a = toEnum (i + fromEnum a)++getMilZoneLetter :: Int -> Char+getMilZoneLetter 0 = 'Z'+getMilZoneLetter h | h < 0 = enumAdd (negate h) 'M'+getMilZoneLetter h | h < 10 = enumAdd (h - 1) 'A'+getMilZoneLetter h = enumAdd (h - 10) 'K'++getMilZone :: Int -> TimeZone+getMilZone hour = TimeZone (hour * 60) False [getMilZoneLetter hour]++testParseTimeZone :: TimeZone -> TestTree+testParseTimeZone tz = parseTest False (Just tz) "%Z" (timeZoneName tz)++defaultTimeZoneTests :: TestTree+defaultTimeZoneTests = testGroup "default time zones" (fmap testParseTimeZone (knownTimeZones defaultTimeLocale))++militaryTimeZoneTests :: TestTree+militaryTimeZoneTests = testGroup "military time zones" (fmap (testParseTimeZone . getMilZone) [-12 .. 12])+++parse :: ParseTime t => Bool -> String -> String -> Maybe t+parse sp f t = parseTimeM sp defaultTimeLocale f t++format :: (FormatTime t) => String -> t -> String+format f t = formatTime defaultTimeLocale f t++instance Arbitrary Day where+    arbitrary = liftM ModifiedJulianDay $ choose (-313698, 2973483) -- 1000-01-1 to 9999-12-31++instance CoArbitrary Day where+    coarbitrary (ModifiedJulianDay d) = coarbitrary d++instance Arbitrary DiffTime where+    arbitrary = oneof [intSecs, fracSecs] -- up to 1 leap second+        where intSecs = liftM secondsToDiffTime' $ choose (0, 86400)+              fracSecs = liftM picosecondsToDiffTime' $ choose (0, 86400 * 10^12)+              secondsToDiffTime' :: Integer -> DiffTime+              secondsToDiffTime' = fromInteger+              picosecondsToDiffTime' :: Integer -> DiffTime+              picosecondsToDiffTime' x = fromRational (x % 10^12)++instance CoArbitrary DiffTime where+    coarbitrary t = coarbitrary (fromEnum t)++instance Arbitrary TimeOfDay where+    arbitrary = liftM timeToTimeOfDay arbitrary++instance CoArbitrary TimeOfDay where+    coarbitrary t = coarbitrary (timeOfDayToTime t)++instance Arbitrary LocalTime where+    arbitrary = liftM2 LocalTime arbitrary arbitrary++instance CoArbitrary LocalTime where+    coarbitrary t = coarbitrary (truncate (utcTimeToPOSIXSeconds (localTimeToUTC utc t)) :: Integer)++instance Arbitrary TimeZone where+    arbitrary = liftM minutesToTimeZone $ choose (-720,720)++instance CoArbitrary TimeZone where+    coarbitrary tz = coarbitrary (timeZoneMinutes tz)++instance Arbitrary ZonedTime where+    arbitrary = liftM2 ZonedTime arbitrary arbitrary++instance CoArbitrary ZonedTime where+    coarbitrary t = coarbitrary (truncate (utcTimeToPOSIXSeconds (zonedTimeToUTC t)) :: Integer)++instance Arbitrary UTCTime where+    arbitrary = liftM2 UTCTime arbitrary arbitrary++instance CoArbitrary UTCTime where+    coarbitrary t = coarbitrary (truncate (utcTimeToPOSIXSeconds t) :: Integer)++instance Arbitrary UniversalTime where+    arbitrary = liftM (\n -> ModJulianDate $ n % k) $ choose (-313698 * k, 2973483 * k) where -- 1000-01-1 to 9999-12-31+        k = 86400++instance CoArbitrary UniversalTime where+    coarbitrary (ModJulianDate d) = coarbitrary d++-- missing from the time package+instance Eq ZonedTime where+    ZonedTime t1 tz1 == ZonedTime t2 tz2 = t1 == t2 && tz1 == tz2++compareResult' :: (Eq a,Show a) => String -> a -> a -> Result+compareResult' extra expected found+    | expected == found = succeeded+    | otherwise = failed {reason = "expected " ++ (show expected) ++ ", found " ++ (show found) ++ extra}++compareResult :: (Eq a,Show a) => a -> a -> Result+compareResult = compareResult' ""++compareParse :: forall a. (Eq a,Show a,ParseTime a) => a -> String -> String -> Result+compareParse expected fmt text = compareResult' (", parsing " ++ (show text)) (Just expected) (parse False fmt text)++--+-- * tests for debugging failing cases+--++test_parse_format :: (FormatTime t,ParseTime t,Show t) => String -> t -> (String,String,Maybe t)+test_parse_format f t = let s = format f t in (show t, s, parse False f s `asTypeOf` Just t)++--+-- * show and read+--++prop_read_show :: (Read a, Show a, Eq a) => a -> Result+prop_read_show t = compareResult [(t,"")] (reads (show t))++--+-- * special show functions+--++prop_parse_showWeekDate :: Day -> Result+prop_parse_showWeekDate d = compareParse d "%G-W%V-%u" (showWeekDate d)++prop_parse_showGregorian :: Day -> Result+prop_parse_showGregorian d = compareParse d "%Y-%m-%d" (showGregorian d)++prop_parse_showOrdinalDate :: Day -> Result+prop_parse_showOrdinalDate d = compareParse d "%Y-%j" (showOrdinalDate d)++--+-- * fromMondayStartWeek and fromSundayStartWeek+--++prop_fromMondayStartWeek :: Day -> Result+prop_fromMondayStartWeek d =+    let (w,wd)  = mondayStartWeek d+        (y,_,_) = toGregorian d+     in compareResult d (fromMondayStartWeek y w wd)++prop_fromSundayStartWeek :: Day -> Result+prop_fromSundayStartWeek d =+    let (w,wd)  = sundayStartWeek d+        (y,_,_) = toGregorian d+     in compareResult d (fromSundayStartWeek y w wd)++--+-- * format and parse+--++prop_parse_format :: (Eq t, FormatTime t, ParseTime t, Show t) => FormatString t -> t -> Result+prop_parse_format (FormatString f) t = compareParse t f (format f t)++-- Verify case-insensitivity with upper case.+prop_parse_format_upper :: (Eq t, FormatTime t, ParseTime t, Show t) => FormatString t -> t -> Result+prop_parse_format_upper (FormatString f) t = compareParse t f (map toUpper $ format f t)++-- Verify case-insensitivity with lower case.+prop_parse_format_lower :: (Eq t, FormatTime t, ParseTime t, Show t) => FormatString t -> t -> Result+prop_parse_format_lower (FormatString f) t = compareParse t f (map toLower $ format f t)++prop_format_parse_format :: (FormatTime t, ParseTime t, Show t) => FormatString t -> t -> Result+prop_format_parse_format (FormatString f) t = compareResult+    (Just (format f t))+    (fmap (format f) (parse False f (format f t) `asTypeOf` Just t))++--+-- * crashes in parse+--++newtype Input = Input String++instance Show Input where+    show (Input s) = s++instance Arbitrary Input where+    arbitrary = liftM Input $ list cs+      where cs = elements (['0'..'9'] ++ ['-',' ','/'] ++ ['a'..'z'] ++ ['A' .. 'Z'])+            list g = sized (\n -> choose (0,n) >>= \l -> replicateM l g)+instance CoArbitrary Input where+    coarbitrary (Input s) = coarbitrary (sum (map ord s))++prop_no_crash_bad_input :: (Eq t, ParseTime t) => FormatString t -> Input -> Property+prop_no_crash_bad_input fs@(FormatString f) (Input s) = property $+    case parse False f s of+      Nothing -> True+      Just t  -> t == t `asTypeOf` formatType fs++--+--+--++newtype FormatString a = FormatString String++formatType :: FormatString t -> t+formatType _ = undefined++instance Show (FormatString a) where+    show (FormatString f) = show f+++typedTests :: (forall t. (Eq t, FormatTime t, ParseTime t, Show t) => FormatString t -> t -> Result) -> [TestTree]+typedTests prop = [+    nameTest "Day" $ tgroup dayFormats prop,+    nameTest "TimeOfDay" $ tgroup timeOfDayFormats prop,+    nameTest "LocalTime" $ tgroup localTimeFormats prop,+    nameTest "TimeZone" $ tgroup timeZoneFormats prop,+    nameTest "ZonedTime" $ tgroup zonedTimeFormats prop,+    nameTest "UTCTime" $ tgroup utcTimeFormats prop,+    nameTest "UniversalTime" $ tgroup universalTimeFormats prop+    ]++formatParseFormatTests :: TestTree+formatParseFormatTests = nameTest "format_parse_format" [+    nameTest "Day" $ tgroup partialDayFormats prop_format_parse_format,+    nameTest "TimeOfDay" $ tgroup partialTimeOfDayFormats prop_format_parse_format,+    nameTest "LocalTime" $ tgroup partialLocalTimeFormats prop_format_parse_format,+    nameTest "ZonedTime" $ tgroup partialZonedTimeFormats prop_format_parse_format,+    nameTest "UTCTime" $ tgroup partialUTCTimeFormats prop_format_parse_format,+    nameTest "UniversalTime" $ tgroup partialUniversalTimeFormats prop_format_parse_format+    ]++badInputTests :: TestTree+badInputTests = nameTest "no_crash_bad_input" [+    nameTest "Day" $ tgroup (dayFormats ++ partialDayFormats ++ failingPartialDayFormats) prop_no_crash_bad_input,+    nameTest "TimeOfDay" $ tgroup (timeOfDayFormats ++ partialTimeOfDayFormats) prop_no_crash_bad_input,+    nameTest "LocalTime" $ tgroup (localTimeFormats ++ partialLocalTimeFormats) prop_no_crash_bad_input,+    nameTest "TimeZone" $ tgroup (timeZoneFormats) prop_no_crash_bad_input,+    nameTest "ZonedTime" $ tgroup (zonedTimeFormats ++ partialZonedTimeFormats) prop_no_crash_bad_input,+    nameTest "UTCTime" $ tgroup (utcTimeFormats ++ partialUTCTimeFormats) prop_no_crash_bad_input,+    nameTest "UniversalTime" $ tgroup (universalTimeFormats ++ partialUniversalTimeFormats) prop_no_crash_bad_input+    ]++readShowTests :: TestTree+readShowTests = nameTest "read_show" [+    nameTest "Day" (prop_read_show :: Day -> Result),+    nameTest "TimeOfDay" (prop_read_show :: TimeOfDay -> Result),+    nameTest "LocalTime" (prop_read_show :: LocalTime -> Result),+    nameTest "TimeZone" (prop_read_show :: TimeZone -> Result),+    nameTest "ZonedTime" (prop_read_show :: ZonedTime -> Result),+    nameTest "UTCTime" (prop_read_show :: UTCTime -> Result),+    nameTest "UniversalTime" (prop_read_show :: UniversalTime -> Result)+    ]++parseShowTests :: TestTree+parseShowTests = nameTest "parse_show" [+    nameTest "showWeekDate" prop_parse_showWeekDate,+    nameTest "showGregorian" prop_parse_showGregorian,+    nameTest "showOrdinalDate" prop_parse_showOrdinalDate+    ]++propertyTests :: TestTree+propertyTests = nameTest "properties" [+    readShowTests,+    parseShowTests,+    nameTest "fromMondayStartWeek" prop_fromMondayStartWeek,+    nameTest "fromSundayStartWeek" prop_fromSundayStartWeek,+    nameTest "parse_format" $ typedTests prop_parse_format,+    nameTest "parse_format_lower" $ typedTests prop_parse_format_lower,+    nameTest "parse_format_upper" $ typedTests prop_parse_format_upper,+    formatParseFormatTests,+    badInputTests+    ]++dayFormats :: [FormatString Day]+dayFormats = map FormatString+    [+     -- numeric year, month, day+     "%Y-%m-%d","%Y%m%d","%C%y%m%d","%Y %m %e","%m/%d/%Y","%d/%m/%Y","%Y/%d/%m","%D %C","%F",+     -- month names+     "%Y-%B-%d","%Y-%b-%d","%Y-%h-%d",+     -- ordinal dates+     "%Y-%j",+     -- ISO week dates+     "%G-%V-%u","%G-%V-%a","%G-%V-%A","%G-%V-%w", "%A week %V, %G", "day %V, week %A, %G",+     "%G-W%V-%u",+     "%f%g-%V-%u","%f%g-%V-%a","%f%g-%V-%A","%f%g-%V-%w", "%A week %V, %f%g", "day %V, week %A, %f%g",+     "%f%g-W%V-%u",+     -- monday and sunday week dates+     "%Y-w%U-%A", "%Y-w%W-%A", "%Y-%A-w%U", "%Y-%A-w%W", "%A week %U, %Y", "%A week %W, %Y"+    ]++timeOfDayFormats :: [FormatString TimeOfDay]+timeOfDayFormats = map FormatString+    [+     -- 24 h formats+     "%H:%M:%S.%q","%k:%M:%S.%q","%H%M%S.%q","%T.%q","%X.%q","%R:%S.%q",+     "%H:%M:%S%Q","%k:%M:%S%Q","%H%M%S%Q","%T%Q","%X%Q","%R:%S%Q",+     -- 12 h formats+     "%I:%M:%S.%q %p","%I:%M:%S.%q %P","%l:%M:%S.%q %p","%r %q",+     "%I:%M:%S%Q %p","%I:%M:%S%Q %P","%l:%M:%S%Q %p","%r %Q"+    ]++localTimeFormats :: [FormatString LocalTime]+localTimeFormats = map FormatString [{-"%Q","%Q ","%QX"-}]++timeZoneFormats :: [FormatString TimeZone]+timeZoneFormats = map FormatString ["%z","%z%Z","%Z%z","%Z"]++zonedTimeFormats :: [FormatString ZonedTime]+zonedTimeFormats = map FormatString+  ["%a, %d %b %Y %H:%M:%S.%q %z", "%a, %d %b %Y %H:%M:%S%Q %z", "%s.%q %z", "%s%Q %z",+   "%a, %d %b %Y %H:%M:%S.%q %Z", "%a, %d %b %Y %H:%M:%S%Q %Z", "%s.%q %Z", "%s%Q %Z"]++utcTimeFormats :: [FormatString UTCTime]+utcTimeFormats = map FormatString+  ["%s.%q","%s%Q"]++universalTimeFormats :: [FormatString UniversalTime]+universalTimeFormats = map FormatString []++--+-- * Formats that do not include all the information+--++partialDayFormats :: [FormatString Day]+partialDayFormats = map FormatString+    [ ]++partialTimeOfDayFormats :: [FormatString TimeOfDay]+partialTimeOfDayFormats = map FormatString+    [ ]++partialLocalTimeFormats :: [FormatString LocalTime]+partialLocalTimeFormats = map FormatString+    [ ]++partialZonedTimeFormats :: [FormatString ZonedTime]+partialZonedTimeFormats = map FormatString+    [+     -- %s does not include second decimals+     "%s %z",+     -- %S does not include second decimals+     "%c", "%a, %d %b %Y %H:%M:%S %Z"+    ]++partialUTCTimeFormats :: [FormatString UTCTime]+partialUTCTimeFormats = map FormatString+    [+     -- %s does not include second decimals+     "%s",+     -- %c does not include second decimals+     "%c"+    ]++partialUniversalTimeFormats :: [FormatString UniversalTime]+partialUniversalTimeFormats = map FormatString+    [ ]++failingPartialDayFormats :: [FormatString Day]+failingPartialDayFormats = map FormatString+    [ -- ISO week dates with two digit year.+      -- This can fail in the beginning or the end of a year where+      -- the ISO week date year does not match the gregorian year.+     "%g-%V-%u","%g-%V-%a","%g-%V-%A","%g-%V-%w", "%A week %V, %g", "day %V, week %A, %g",+     "%g-W%V-%u"+    ]
+ test/main/Test/LocalTime/Time.hs view
@@ -0,0 +1,107 @@+module Test.LocalTime.Time(testTime) where++import Data.Time.Calendar.OrdinalDate+import Data.Time.Calendar.WeekDate+import Data.Time+import Test.Tasty+import Test.Tasty.HUnit+import Test.LocalTime.TimeRef++showCal :: Integer -> String+showCal mjd+  = let date    = ModifiedJulianDay mjd+        (y,m,d) = toGregorian date+        date' = fromGregorian y m d+    in concat [ show mjd ++ "="+                 ++ showGregorian date ++ "="+                 ++ showOrdinalDate date ++ "="+                 ++ showWeekDate date+                 ++ "\n"++               , if date == date'+                   then ""+                   else "=" ++ (show $ toModifiedJulianDay date') ++ "!" ]++testCal :: String+testCal+  = concat+        -- days around 1 BCE/1 CE+      [ concatMap showCal [-678950 .. -678930]++        -- days around 1000 CE+      , concatMap showCal [-313710 .. -313690]++        -- days around MJD zero+      , concatMap showCal [-30..30]+      , showCal 40000+      , showCal 50000++        -- 1900 not a leap year+      , showCal 15078+      , showCal 15079++        -- 1980 is a leap year+      , showCal 44297+      , showCal 44298+      , showCal 44299++        -- 1990 not a leap year+      , showCal 47950+      , showCal 47951++        -- 2000 is a leap year+      , showCal 51602+      , showCal 51603+      , showCal 51604++        -- years 2000 and 2001, plus some slop+      , concatMap showCal [51540..52280] ]++showUTCTime :: UTCTime -> String+showUTCTime (UTCTime d t) =  show (toModifiedJulianDay d) ++ "," ++ show t++myzone :: TimeZone+myzone = hoursToTimeZone (- 8)++leapSec1998Cal :: LocalTime+leapSec1998Cal = LocalTime (fromGregorian 1998 12 31) (TimeOfDay 23 59 60.5)++leapSec1998 :: UTCTime+leapSec1998 = localTimeToUTC utc leapSec1998Cal++testUTC :: String+testUTC+  = let lsMineCal = utcToLocalTime myzone leapSec1998+        lsMine = localTimeToUTC myzone lsMineCal+    in unlines [ showCal 51178+           , show leapSec1998Cal+           , showUTCTime leapSec1998+           , show lsMineCal+           , showUTCTime lsMine ]++neglong :: Rational+neglong = -120++poslong :: Rational+poslong = 120++testUT1 :: String+testUT1+  = unlines [ show $ ut1ToLocalTime 0 $ ModJulianDate 51604.0+            , show $ ut1ToLocalTime 0 $ ModJulianDate 51604.5+            , show $ ut1ToLocalTime neglong $ ModJulianDate 51604.0+            , show $ ut1ToLocalTime neglong $ ModJulianDate 51604.5+            , show $ ut1ToLocalTime poslong $ ModJulianDate 51604.0+            , show $ ut1ToLocalTime poslong $ ModJulianDate 51604.5 ]++testTimeOfDayToDayFraction :: String+testTimeOfDayToDayFraction+  = let f = dayFractionToTimeOfDay . timeOfDayToDayFraction+    in unlines [ show $ f $ TimeOfDay 12 34 56.789+               , show $ f $ TimeOfDay 12 34 56.789123+               , show $ f $ TimeOfDay 12 34 56.789123456+               , show $ f $ TimeOfDay 12 34 56.789123456789 ]++testTime :: TestTree+testTime = testCase "testTime" $+    assertEqual "times" testTimeRef $ unlines [testCal, testUTC, testUT1, testTimeOfDayToDayFraction]
+ test/main/Test/LocalTime/TimeRef.hs view
@@ -0,0 +1,881 @@+module Test.LocalTime.TimeRef where++testTimeRef :: String+testTimeRef =+  unlines [+  "-678950=-0001-12-23=-0001-357=-0001-W51-4"+  ,"-678949=-0001-12-24=-0001-358=-0001-W51-5"+  ,"-678948=-0001-12-25=-0001-359=-0001-W51-6"+  ,"-678947=-0001-12-26=-0001-360=-0001-W51-7"+  ,"-678946=-0001-12-27=-0001-361=-0001-W52-1"+  ,"-678945=-0001-12-28=-0001-362=-0001-W52-2"+  ,"-678944=-0001-12-29=-0001-363=-0001-W52-3"+  ,"-678943=-0001-12-30=-0001-364=-0001-W52-4"+  ,"-678942=-0001-12-31=-0001-365=-0001-W52-5"+  ,"-678941=0000-01-01=0000-001=-0001-W52-6"+  ,"-678940=0000-01-02=0000-002=-0001-W52-7"+  ,"-678939=0000-01-03=0000-003=0000-W01-1"+  ,"-678938=0000-01-04=0000-004=0000-W01-2"+  ,"-678937=0000-01-05=0000-005=0000-W01-3"+  ,"-678936=0000-01-06=0000-006=0000-W01-4"+  ,"-678935=0000-01-07=0000-007=0000-W01-5"+  ,"-678934=0000-01-08=0000-008=0000-W01-6"+  ,"-678933=0000-01-09=0000-009=0000-W01-7"+  ,"-678932=0000-01-10=0000-010=0000-W02-1"+  ,"-678931=0000-01-11=0000-011=0000-W02-2"+  ,"-678930=0000-01-12=0000-012=0000-W02-3"+  ,"-313710=0999-12-20=0999-354=0999-W51-5"+  ,"-313709=0999-12-21=0999-355=0999-W51-6"+  ,"-313708=0999-12-22=0999-356=0999-W51-7"+  ,"-313707=0999-12-23=0999-357=0999-W52-1"+  ,"-313706=0999-12-24=0999-358=0999-W52-2"+  ,"-313705=0999-12-25=0999-359=0999-W52-3"+  ,"-313704=0999-12-26=0999-360=0999-W52-4"+  ,"-313703=0999-12-27=0999-361=0999-W52-5"+  ,"-313702=0999-12-28=0999-362=0999-W52-6"+  ,"-313701=0999-12-29=0999-363=0999-W52-7"+  ,"-313700=0999-12-30=0999-364=1000-W01-1"+  ,"-313699=0999-12-31=0999-365=1000-W01-2"+  ,"-313698=1000-01-01=1000-001=1000-W01-3"+  ,"-313697=1000-01-02=1000-002=1000-W01-4"+  ,"-313696=1000-01-03=1000-003=1000-W01-5"+  ,"-313695=1000-01-04=1000-004=1000-W01-6"+  ,"-313694=1000-01-05=1000-005=1000-W01-7"+  ,"-313693=1000-01-06=1000-006=1000-W02-1"+  ,"-313692=1000-01-07=1000-007=1000-W02-2"+  ,"-313691=1000-01-08=1000-008=1000-W02-3"+  ,"-313690=1000-01-09=1000-009=1000-W02-4"+  ,"-30=1858-10-18=1858-291=1858-W42-1"+  ,"-29=1858-10-19=1858-292=1858-W42-2"+  ,"-28=1858-10-20=1858-293=1858-W42-3"+  ,"-27=1858-10-21=1858-294=1858-W42-4"+  ,"-26=1858-10-22=1858-295=1858-W42-5"+  ,"-25=1858-10-23=1858-296=1858-W42-6"+  ,"-24=1858-10-24=1858-297=1858-W42-7"+  ,"-23=1858-10-25=1858-298=1858-W43-1"+  ,"-22=1858-10-26=1858-299=1858-W43-2"+  ,"-21=1858-10-27=1858-300=1858-W43-3"+  ,"-20=1858-10-28=1858-301=1858-W43-4"+  ,"-19=1858-10-29=1858-302=1858-W43-5"+  ,"-18=1858-10-30=1858-303=1858-W43-6"+  ,"-17=1858-10-31=1858-304=1858-W43-7"+  ,"-16=1858-11-01=1858-305=1858-W44-1"+  ,"-15=1858-11-02=1858-306=1858-W44-2"+  ,"-14=1858-11-03=1858-307=1858-W44-3"+  ,"-13=1858-11-04=1858-308=1858-W44-4"+  ,"-12=1858-11-05=1858-309=1858-W44-5"+  ,"-11=1858-11-06=1858-310=1858-W44-6"+  ,"-10=1858-11-07=1858-311=1858-W44-7"+  ,"-9=1858-11-08=1858-312=1858-W45-1"+  ,"-8=1858-11-09=1858-313=1858-W45-2"+  ,"-7=1858-11-10=1858-314=1858-W45-3"+  ,"-6=1858-11-11=1858-315=1858-W45-4"+  ,"-5=1858-11-12=1858-316=1858-W45-5"+  ,"-4=1858-11-13=1858-317=1858-W45-6"+  ,"-3=1858-11-14=1858-318=1858-W45-7"+  ,"-2=1858-11-15=1858-319=1858-W46-1"+  ,"-1=1858-11-16=1858-320=1858-W46-2"+  ,"0=1858-11-17=1858-321=1858-W46-3"+  ,"1=1858-11-18=1858-322=1858-W46-4"+  ,"2=1858-11-19=1858-323=1858-W46-5"+  ,"3=1858-11-20=1858-324=1858-W46-6"+  ,"4=1858-11-21=1858-325=1858-W46-7"+  ,"5=1858-11-22=1858-326=1858-W47-1"+  ,"6=1858-11-23=1858-327=1858-W47-2"+  ,"7=1858-11-24=1858-328=1858-W47-3"+  ,"8=1858-11-25=1858-329=1858-W47-4"+  ,"9=1858-11-26=1858-330=1858-W47-5"+  ,"10=1858-11-27=1858-331=1858-W47-6"+  ,"11=1858-11-28=1858-332=1858-W47-7"+  ,"12=1858-11-29=1858-333=1858-W48-1"+  ,"13=1858-11-30=1858-334=1858-W48-2"+  ,"14=1858-12-01=1858-335=1858-W48-3"+  ,"15=1858-12-02=1858-336=1858-W48-4"+  ,"16=1858-12-03=1858-337=1858-W48-5"+  ,"17=1858-12-04=1858-338=1858-W48-6"+  ,"18=1858-12-05=1858-339=1858-W48-7"+  ,"19=1858-12-06=1858-340=1858-W49-1"+  ,"20=1858-12-07=1858-341=1858-W49-2"+  ,"21=1858-12-08=1858-342=1858-W49-3"+  ,"22=1858-12-09=1858-343=1858-W49-4"+  ,"23=1858-12-10=1858-344=1858-W49-5"+  ,"24=1858-12-11=1858-345=1858-W49-6"+  ,"25=1858-12-12=1858-346=1858-W49-7"+  ,"26=1858-12-13=1858-347=1858-W50-1"+  ,"27=1858-12-14=1858-348=1858-W50-2"+  ,"28=1858-12-15=1858-349=1858-W50-3"+  ,"29=1858-12-16=1858-350=1858-W50-4"+  ,"30=1858-12-17=1858-351=1858-W50-5"+  ,"40000=1968-05-24=1968-145=1968-W21-5"+  ,"50000=1995-10-10=1995-283=1995-W41-2"+  ,"15078=1900-02-28=1900-059=1900-W09-3"+  ,"15079=1900-03-01=1900-060=1900-W09-4"+  ,"44297=1980-02-28=1980-059=1980-W09-4"+  ,"44298=1980-02-29=1980-060=1980-W09-5"+  ,"44299=1980-03-01=1980-061=1980-W09-6"+  ,"47950=1990-02-28=1990-059=1990-W09-3"+  ,"47951=1990-03-01=1990-060=1990-W09-4"+  ,"51602=2000-02-28=2000-059=2000-W09-1"+  ,"51603=2000-02-29=2000-060=2000-W09-2"+  ,"51604=2000-03-01=2000-061=2000-W09-3"+  ,"51540=1999-12-28=1999-362=1999-W52-2"+  ,"51541=1999-12-29=1999-363=1999-W52-3"+  ,"51542=1999-12-30=1999-364=1999-W52-4"+  ,"51543=1999-12-31=1999-365=1999-W52-5"+  ,"51544=2000-01-01=2000-001=1999-W52-6"+  ,"51545=2000-01-02=2000-002=1999-W52-7"+  ,"51546=2000-01-03=2000-003=2000-W01-1"+  ,"51547=2000-01-04=2000-004=2000-W01-2"+  ,"51548=2000-01-05=2000-005=2000-W01-3"+  ,"51549=2000-01-06=2000-006=2000-W01-4"+  ,"51550=2000-01-07=2000-007=2000-W01-5"+  ,"51551=2000-01-08=2000-008=2000-W01-6"+  ,"51552=2000-01-09=2000-009=2000-W01-7"+  ,"51553=2000-01-10=2000-010=2000-W02-1"+  ,"51554=2000-01-11=2000-011=2000-W02-2"+  ,"51555=2000-01-12=2000-012=2000-W02-3"+  ,"51556=2000-01-13=2000-013=2000-W02-4"+  ,"51557=2000-01-14=2000-014=2000-W02-5"+  ,"51558=2000-01-15=2000-015=2000-W02-6"+  ,"51559=2000-01-16=2000-016=2000-W02-7"+  ,"51560=2000-01-17=2000-017=2000-W03-1"+  ,"51561=2000-01-18=2000-018=2000-W03-2"+  ,"51562=2000-01-19=2000-019=2000-W03-3"+  ,"51563=2000-01-20=2000-020=2000-W03-4"+  ,"51564=2000-01-21=2000-021=2000-W03-5"+  ,"51565=2000-01-22=2000-022=2000-W03-6"+  ,"51566=2000-01-23=2000-023=2000-W03-7"+  ,"51567=2000-01-24=2000-024=2000-W04-1"+  ,"51568=2000-01-25=2000-025=2000-W04-2"+  ,"51569=2000-01-26=2000-026=2000-W04-3"+  ,"51570=2000-01-27=2000-027=2000-W04-4"+  ,"51571=2000-01-28=2000-028=2000-W04-5"+  ,"51572=2000-01-29=2000-029=2000-W04-6"+  ,"51573=2000-01-30=2000-030=2000-W04-7"+  ,"51574=2000-01-31=2000-031=2000-W05-1"+  ,"51575=2000-02-01=2000-032=2000-W05-2"+  ,"51576=2000-02-02=2000-033=2000-W05-3"+  ,"51577=2000-02-03=2000-034=2000-W05-4"+  ,"51578=2000-02-04=2000-035=2000-W05-5"+  ,"51579=2000-02-05=2000-036=2000-W05-6"+  ,"51580=2000-02-06=2000-037=2000-W05-7"+  ,"51581=2000-02-07=2000-038=2000-W06-1"+  ,"51582=2000-02-08=2000-039=2000-W06-2"+  ,"51583=2000-02-09=2000-040=2000-W06-3"+  ,"51584=2000-02-10=2000-041=2000-W06-4"+  ,"51585=2000-02-11=2000-042=2000-W06-5"+  ,"51586=2000-02-12=2000-043=2000-W06-6"+  ,"51587=2000-02-13=2000-044=2000-W06-7"+  ,"51588=2000-02-14=2000-045=2000-W07-1"+  ,"51589=2000-02-15=2000-046=2000-W07-2"+  ,"51590=2000-02-16=2000-047=2000-W07-3"+  ,"51591=2000-02-17=2000-048=2000-W07-4"+  ,"51592=2000-02-18=2000-049=2000-W07-5"+  ,"51593=2000-02-19=2000-050=2000-W07-6"+  ,"51594=2000-02-20=2000-051=2000-W07-7"+  ,"51595=2000-02-21=2000-052=2000-W08-1"+  ,"51596=2000-02-22=2000-053=2000-W08-2"+  ,"51597=2000-02-23=2000-054=2000-W08-3"+  ,"51598=2000-02-24=2000-055=2000-W08-4"+  ,"51599=2000-02-25=2000-056=2000-W08-5"+  ,"51600=2000-02-26=2000-057=2000-W08-6"+  ,"51601=2000-02-27=2000-058=2000-W08-7"+  ,"51602=2000-02-28=2000-059=2000-W09-1"+  ,"51603=2000-02-29=2000-060=2000-W09-2"+  ,"51604=2000-03-01=2000-061=2000-W09-3"+  ,"51605=2000-03-02=2000-062=2000-W09-4"+  ,"51606=2000-03-03=2000-063=2000-W09-5"+  ,"51607=2000-03-04=2000-064=2000-W09-6"+  ,"51608=2000-03-05=2000-065=2000-W09-7"+  ,"51609=2000-03-06=2000-066=2000-W10-1"+  ,"51610=2000-03-07=2000-067=2000-W10-2"+  ,"51611=2000-03-08=2000-068=2000-W10-3"+  ,"51612=2000-03-09=2000-069=2000-W10-4"+  ,"51613=2000-03-10=2000-070=2000-W10-5"+  ,"51614=2000-03-11=2000-071=2000-W10-6"+  ,"51615=2000-03-12=2000-072=2000-W10-7"+  ,"51616=2000-03-13=2000-073=2000-W11-1"+  ,"51617=2000-03-14=2000-074=2000-W11-2"+  ,"51618=2000-03-15=2000-075=2000-W11-3"+  ,"51619=2000-03-16=2000-076=2000-W11-4"+  ,"51620=2000-03-17=2000-077=2000-W11-5"+  ,"51621=2000-03-18=2000-078=2000-W11-6"+  ,"51622=2000-03-19=2000-079=2000-W11-7"+  ,"51623=2000-03-20=2000-080=2000-W12-1"+  ,"51624=2000-03-21=2000-081=2000-W12-2"+  ,"51625=2000-03-22=2000-082=2000-W12-3"+  ,"51626=2000-03-23=2000-083=2000-W12-4"+  ,"51627=2000-03-24=2000-084=2000-W12-5"+  ,"51628=2000-03-25=2000-085=2000-W12-6"+  ,"51629=2000-03-26=2000-086=2000-W12-7"+  ,"51630=2000-03-27=2000-087=2000-W13-1"+  ,"51631=2000-03-28=2000-088=2000-W13-2"+  ,"51632=2000-03-29=2000-089=2000-W13-3"+  ,"51633=2000-03-30=2000-090=2000-W13-4"+  ,"51634=2000-03-31=2000-091=2000-W13-5"+  ,"51635=2000-04-01=2000-092=2000-W13-6"+  ,"51636=2000-04-02=2000-093=2000-W13-7"+  ,"51637=2000-04-03=2000-094=2000-W14-1"+  ,"51638=2000-04-04=2000-095=2000-W14-2"+  ,"51639=2000-04-05=2000-096=2000-W14-3"+  ,"51640=2000-04-06=2000-097=2000-W14-4"+  ,"51641=2000-04-07=2000-098=2000-W14-5"+  ,"51642=2000-04-08=2000-099=2000-W14-6"+  ,"51643=2000-04-09=2000-100=2000-W14-7"+  ,"51644=2000-04-10=2000-101=2000-W15-1"+  ,"51645=2000-04-11=2000-102=2000-W15-2"+  ,"51646=2000-04-12=2000-103=2000-W15-3"+  ,"51647=2000-04-13=2000-104=2000-W15-4"+  ,"51648=2000-04-14=2000-105=2000-W15-5"+  ,"51649=2000-04-15=2000-106=2000-W15-6"+  ,"51650=2000-04-16=2000-107=2000-W15-7"+  ,"51651=2000-04-17=2000-108=2000-W16-1"+  ,"51652=2000-04-18=2000-109=2000-W16-2"+  ,"51653=2000-04-19=2000-110=2000-W16-3"+  ,"51654=2000-04-20=2000-111=2000-W16-4"+  ,"51655=2000-04-21=2000-112=2000-W16-5"+  ,"51656=2000-04-22=2000-113=2000-W16-6"+  ,"51657=2000-04-23=2000-114=2000-W16-7"+  ,"51658=2000-04-24=2000-115=2000-W17-1"+  ,"51659=2000-04-25=2000-116=2000-W17-2"+  ,"51660=2000-04-26=2000-117=2000-W17-3"+  ,"51661=2000-04-27=2000-118=2000-W17-4"+  ,"51662=2000-04-28=2000-119=2000-W17-5"+  ,"51663=2000-04-29=2000-120=2000-W17-6"+  ,"51664=2000-04-30=2000-121=2000-W17-7"+  ,"51665=2000-05-01=2000-122=2000-W18-1"+  ,"51666=2000-05-02=2000-123=2000-W18-2"+  ,"51667=2000-05-03=2000-124=2000-W18-3"+  ,"51668=2000-05-04=2000-125=2000-W18-4"+  ,"51669=2000-05-05=2000-126=2000-W18-5"+  ,"51670=2000-05-06=2000-127=2000-W18-6"+  ,"51671=2000-05-07=2000-128=2000-W18-7"+  ,"51672=2000-05-08=2000-129=2000-W19-1"+  ,"51673=2000-05-09=2000-130=2000-W19-2"+  ,"51674=2000-05-10=2000-131=2000-W19-3"+  ,"51675=2000-05-11=2000-132=2000-W19-4"+  ,"51676=2000-05-12=2000-133=2000-W19-5"+  ,"51677=2000-05-13=2000-134=2000-W19-6"+  ,"51678=2000-05-14=2000-135=2000-W19-7"+  ,"51679=2000-05-15=2000-136=2000-W20-1"+  ,"51680=2000-05-16=2000-137=2000-W20-2"+  ,"51681=2000-05-17=2000-138=2000-W20-3"+  ,"51682=2000-05-18=2000-139=2000-W20-4"+  ,"51683=2000-05-19=2000-140=2000-W20-5"+  ,"51684=2000-05-20=2000-141=2000-W20-6"+  ,"51685=2000-05-21=2000-142=2000-W20-7"+  ,"51686=2000-05-22=2000-143=2000-W21-1"+  ,"51687=2000-05-23=2000-144=2000-W21-2"+  ,"51688=2000-05-24=2000-145=2000-W21-3"+  ,"51689=2000-05-25=2000-146=2000-W21-4"+  ,"51690=2000-05-26=2000-147=2000-W21-5"+  ,"51691=2000-05-27=2000-148=2000-W21-6"+  ,"51692=2000-05-28=2000-149=2000-W21-7"+  ,"51693=2000-05-29=2000-150=2000-W22-1"+  ,"51694=2000-05-30=2000-151=2000-W22-2"+  ,"51695=2000-05-31=2000-152=2000-W22-3"+  ,"51696=2000-06-01=2000-153=2000-W22-4"+  ,"51697=2000-06-02=2000-154=2000-W22-5"+  ,"51698=2000-06-03=2000-155=2000-W22-6"+  ,"51699=2000-06-04=2000-156=2000-W22-7"+  ,"51700=2000-06-05=2000-157=2000-W23-1"+  ,"51701=2000-06-06=2000-158=2000-W23-2"+  ,"51702=2000-06-07=2000-159=2000-W23-3"+  ,"51703=2000-06-08=2000-160=2000-W23-4"+  ,"51704=2000-06-09=2000-161=2000-W23-5"+  ,"51705=2000-06-10=2000-162=2000-W23-6"+  ,"51706=2000-06-11=2000-163=2000-W23-7"+  ,"51707=2000-06-12=2000-164=2000-W24-1"+  ,"51708=2000-06-13=2000-165=2000-W24-2"+  ,"51709=2000-06-14=2000-166=2000-W24-3"+  ,"51710=2000-06-15=2000-167=2000-W24-4"+  ,"51711=2000-06-16=2000-168=2000-W24-5"+  ,"51712=2000-06-17=2000-169=2000-W24-6"+  ,"51713=2000-06-18=2000-170=2000-W24-7"+  ,"51714=2000-06-19=2000-171=2000-W25-1"+  ,"51715=2000-06-20=2000-172=2000-W25-2"+  ,"51716=2000-06-21=2000-173=2000-W25-3"+  ,"51717=2000-06-22=2000-174=2000-W25-4"+  ,"51718=2000-06-23=2000-175=2000-W25-5"+  ,"51719=2000-06-24=2000-176=2000-W25-6"+  ,"51720=2000-06-25=2000-177=2000-W25-7"+  ,"51721=2000-06-26=2000-178=2000-W26-1"+  ,"51722=2000-06-27=2000-179=2000-W26-2"+  ,"51723=2000-06-28=2000-180=2000-W26-3"+  ,"51724=2000-06-29=2000-181=2000-W26-4"+  ,"51725=2000-06-30=2000-182=2000-W26-5"+  ,"51726=2000-07-01=2000-183=2000-W26-6"+  ,"51727=2000-07-02=2000-184=2000-W26-7"+  ,"51728=2000-07-03=2000-185=2000-W27-1"+  ,"51729=2000-07-04=2000-186=2000-W27-2"+  ,"51730=2000-07-05=2000-187=2000-W27-3"+  ,"51731=2000-07-06=2000-188=2000-W27-4"+  ,"51732=2000-07-07=2000-189=2000-W27-5"+  ,"51733=2000-07-08=2000-190=2000-W27-6"+  ,"51734=2000-07-09=2000-191=2000-W27-7"+  ,"51735=2000-07-10=2000-192=2000-W28-1"+  ,"51736=2000-07-11=2000-193=2000-W28-2"+  ,"51737=2000-07-12=2000-194=2000-W28-3"+  ,"51738=2000-07-13=2000-195=2000-W28-4"+  ,"51739=2000-07-14=2000-196=2000-W28-5"+  ,"51740=2000-07-15=2000-197=2000-W28-6"+  ,"51741=2000-07-16=2000-198=2000-W28-7"+  ,"51742=2000-07-17=2000-199=2000-W29-1"+  ,"51743=2000-07-18=2000-200=2000-W29-2"+  ,"51744=2000-07-19=2000-201=2000-W29-3"+  ,"51745=2000-07-20=2000-202=2000-W29-4"+  ,"51746=2000-07-21=2000-203=2000-W29-5"+  ,"51747=2000-07-22=2000-204=2000-W29-6"+  ,"51748=2000-07-23=2000-205=2000-W29-7"+  ,"51749=2000-07-24=2000-206=2000-W30-1"+  ,"51750=2000-07-25=2000-207=2000-W30-2"+  ,"51751=2000-07-26=2000-208=2000-W30-3"+  ,"51752=2000-07-27=2000-209=2000-W30-4"+  ,"51753=2000-07-28=2000-210=2000-W30-5"+  ,"51754=2000-07-29=2000-211=2000-W30-6"+  ,"51755=2000-07-30=2000-212=2000-W30-7"+  ,"51756=2000-07-31=2000-213=2000-W31-1"+  ,"51757=2000-08-01=2000-214=2000-W31-2"+  ,"51758=2000-08-02=2000-215=2000-W31-3"+  ,"51759=2000-08-03=2000-216=2000-W31-4"+  ,"51760=2000-08-04=2000-217=2000-W31-5"+  ,"51761=2000-08-05=2000-218=2000-W31-6"+  ,"51762=2000-08-06=2000-219=2000-W31-7"+  ,"51763=2000-08-07=2000-220=2000-W32-1"+  ,"51764=2000-08-08=2000-221=2000-W32-2"+  ,"51765=2000-08-09=2000-222=2000-W32-3"+  ,"51766=2000-08-10=2000-223=2000-W32-4"+  ,"51767=2000-08-11=2000-224=2000-W32-5"+  ,"51768=2000-08-12=2000-225=2000-W32-6"+  ,"51769=2000-08-13=2000-226=2000-W32-7"+  ,"51770=2000-08-14=2000-227=2000-W33-1"+  ,"51771=2000-08-15=2000-228=2000-W33-2"+  ,"51772=2000-08-16=2000-229=2000-W33-3"+  ,"51773=2000-08-17=2000-230=2000-W33-4"+  ,"51774=2000-08-18=2000-231=2000-W33-5"+  ,"51775=2000-08-19=2000-232=2000-W33-6"+  ,"51776=2000-08-20=2000-233=2000-W33-7"+  ,"51777=2000-08-21=2000-234=2000-W34-1"+  ,"51778=2000-08-22=2000-235=2000-W34-2"+  ,"51779=2000-08-23=2000-236=2000-W34-3"+  ,"51780=2000-08-24=2000-237=2000-W34-4"+  ,"51781=2000-08-25=2000-238=2000-W34-5"+  ,"51782=2000-08-26=2000-239=2000-W34-6"+  ,"51783=2000-08-27=2000-240=2000-W34-7"+  ,"51784=2000-08-28=2000-241=2000-W35-1"+  ,"51785=2000-08-29=2000-242=2000-W35-2"+  ,"51786=2000-08-30=2000-243=2000-W35-3"+  ,"51787=2000-08-31=2000-244=2000-W35-4"+  ,"51788=2000-09-01=2000-245=2000-W35-5"+  ,"51789=2000-09-02=2000-246=2000-W35-6"+  ,"51790=2000-09-03=2000-247=2000-W35-7"+  ,"51791=2000-09-04=2000-248=2000-W36-1"+  ,"51792=2000-09-05=2000-249=2000-W36-2"+  ,"51793=2000-09-06=2000-250=2000-W36-3"+  ,"51794=2000-09-07=2000-251=2000-W36-4"+  ,"51795=2000-09-08=2000-252=2000-W36-5"+  ,"51796=2000-09-09=2000-253=2000-W36-6"+  ,"51797=2000-09-10=2000-254=2000-W36-7"+  ,"51798=2000-09-11=2000-255=2000-W37-1"+  ,"51799=2000-09-12=2000-256=2000-W37-2"+  ,"51800=2000-09-13=2000-257=2000-W37-3"+  ,"51801=2000-09-14=2000-258=2000-W37-4"+  ,"51802=2000-09-15=2000-259=2000-W37-5"+  ,"51803=2000-09-16=2000-260=2000-W37-6"+  ,"51804=2000-09-17=2000-261=2000-W37-7"+  ,"51805=2000-09-18=2000-262=2000-W38-1"+  ,"51806=2000-09-19=2000-263=2000-W38-2"+  ,"51807=2000-09-20=2000-264=2000-W38-3"+  ,"51808=2000-09-21=2000-265=2000-W38-4"+  ,"51809=2000-09-22=2000-266=2000-W38-5"+  ,"51810=2000-09-23=2000-267=2000-W38-6"+  ,"51811=2000-09-24=2000-268=2000-W38-7"+  ,"51812=2000-09-25=2000-269=2000-W39-1"+  ,"51813=2000-09-26=2000-270=2000-W39-2"+  ,"51814=2000-09-27=2000-271=2000-W39-3"+  ,"51815=2000-09-28=2000-272=2000-W39-4"+  ,"51816=2000-09-29=2000-273=2000-W39-5"+  ,"51817=2000-09-30=2000-274=2000-W39-6"+  ,"51818=2000-10-01=2000-275=2000-W39-7"+  ,"51819=2000-10-02=2000-276=2000-W40-1"+  ,"51820=2000-10-03=2000-277=2000-W40-2"+  ,"51821=2000-10-04=2000-278=2000-W40-3"+  ,"51822=2000-10-05=2000-279=2000-W40-4"+  ,"51823=2000-10-06=2000-280=2000-W40-5"+  ,"51824=2000-10-07=2000-281=2000-W40-6"+  ,"51825=2000-10-08=2000-282=2000-W40-7"+  ,"51826=2000-10-09=2000-283=2000-W41-1"+  ,"51827=2000-10-10=2000-284=2000-W41-2"+  ,"51828=2000-10-11=2000-285=2000-W41-3"+  ,"51829=2000-10-12=2000-286=2000-W41-4"+  ,"51830=2000-10-13=2000-287=2000-W41-5"+  ,"51831=2000-10-14=2000-288=2000-W41-6"+  ,"51832=2000-10-15=2000-289=2000-W41-7"+  ,"51833=2000-10-16=2000-290=2000-W42-1"+  ,"51834=2000-10-17=2000-291=2000-W42-2"+  ,"51835=2000-10-18=2000-292=2000-W42-3"+  ,"51836=2000-10-19=2000-293=2000-W42-4"+  ,"51837=2000-10-20=2000-294=2000-W42-5"+  ,"51838=2000-10-21=2000-295=2000-W42-6"+  ,"51839=2000-10-22=2000-296=2000-W42-7"+  ,"51840=2000-10-23=2000-297=2000-W43-1"+  ,"51841=2000-10-24=2000-298=2000-W43-2"+  ,"51842=2000-10-25=2000-299=2000-W43-3"+  ,"51843=2000-10-26=2000-300=2000-W43-4"+  ,"51844=2000-10-27=2000-301=2000-W43-5"+  ,"51845=2000-10-28=2000-302=2000-W43-6"+  ,"51846=2000-10-29=2000-303=2000-W43-7"+  ,"51847=2000-10-30=2000-304=2000-W44-1"+  ,"51848=2000-10-31=2000-305=2000-W44-2"+  ,"51849=2000-11-01=2000-306=2000-W44-3"+  ,"51850=2000-11-02=2000-307=2000-W44-4"+  ,"51851=2000-11-03=2000-308=2000-W44-5"+  ,"51852=2000-11-04=2000-309=2000-W44-6"+  ,"51853=2000-11-05=2000-310=2000-W44-7"+  ,"51854=2000-11-06=2000-311=2000-W45-1"+  ,"51855=2000-11-07=2000-312=2000-W45-2"+  ,"51856=2000-11-08=2000-313=2000-W45-3"+  ,"51857=2000-11-09=2000-314=2000-W45-4"+  ,"51858=2000-11-10=2000-315=2000-W45-5"+  ,"51859=2000-11-11=2000-316=2000-W45-6"+  ,"51860=2000-11-12=2000-317=2000-W45-7"+  ,"51861=2000-11-13=2000-318=2000-W46-1"+  ,"51862=2000-11-14=2000-319=2000-W46-2"+  ,"51863=2000-11-15=2000-320=2000-W46-3"+  ,"51864=2000-11-16=2000-321=2000-W46-4"+  ,"51865=2000-11-17=2000-322=2000-W46-5"+  ,"51866=2000-11-18=2000-323=2000-W46-6"+  ,"51867=2000-11-19=2000-324=2000-W46-7"+  ,"51868=2000-11-20=2000-325=2000-W47-1"+  ,"51869=2000-11-21=2000-326=2000-W47-2"+  ,"51870=2000-11-22=2000-327=2000-W47-3"+  ,"51871=2000-11-23=2000-328=2000-W47-4"+  ,"51872=2000-11-24=2000-329=2000-W47-5"+  ,"51873=2000-11-25=2000-330=2000-W47-6"+  ,"51874=2000-11-26=2000-331=2000-W47-7"+  ,"51875=2000-11-27=2000-332=2000-W48-1"+  ,"51876=2000-11-28=2000-333=2000-W48-2"+  ,"51877=2000-11-29=2000-334=2000-W48-3"+  ,"51878=2000-11-30=2000-335=2000-W48-4"+  ,"51879=2000-12-01=2000-336=2000-W48-5"+  ,"51880=2000-12-02=2000-337=2000-W48-6"+  ,"51881=2000-12-03=2000-338=2000-W48-7"+  ,"51882=2000-12-04=2000-339=2000-W49-1"+  ,"51883=2000-12-05=2000-340=2000-W49-2"+  ,"51884=2000-12-06=2000-341=2000-W49-3"+  ,"51885=2000-12-07=2000-342=2000-W49-4"+  ,"51886=2000-12-08=2000-343=2000-W49-5"+  ,"51887=2000-12-09=2000-344=2000-W49-6"+  ,"51888=2000-12-10=2000-345=2000-W49-7"+  ,"51889=2000-12-11=2000-346=2000-W50-1"+  ,"51890=2000-12-12=2000-347=2000-W50-2"+  ,"51891=2000-12-13=2000-348=2000-W50-3"+  ,"51892=2000-12-14=2000-349=2000-W50-4"+  ,"51893=2000-12-15=2000-350=2000-W50-5"+  ,"51894=2000-12-16=2000-351=2000-W50-6"+  ,"51895=2000-12-17=2000-352=2000-W50-7"+  ,"51896=2000-12-18=2000-353=2000-W51-1"+  ,"51897=2000-12-19=2000-354=2000-W51-2"+  ,"51898=2000-12-20=2000-355=2000-W51-3"+  ,"51899=2000-12-21=2000-356=2000-W51-4"+  ,"51900=2000-12-22=2000-357=2000-W51-5"+  ,"51901=2000-12-23=2000-358=2000-W51-6"+  ,"51902=2000-12-24=2000-359=2000-W51-7"+  ,"51903=2000-12-25=2000-360=2000-W52-1"+  ,"51904=2000-12-26=2000-361=2000-W52-2"+  ,"51905=2000-12-27=2000-362=2000-W52-3"+  ,"51906=2000-12-28=2000-363=2000-W52-4"+  ,"51907=2000-12-29=2000-364=2000-W52-5"+  ,"51908=2000-12-30=2000-365=2000-W52-6"+  ,"51909=2000-12-31=2000-366=2000-W52-7"+  ,"51910=2001-01-01=2001-001=2001-W01-1"+  ,"51911=2001-01-02=2001-002=2001-W01-2"+  ,"51912=2001-01-03=2001-003=2001-W01-3"+  ,"51913=2001-01-04=2001-004=2001-W01-4"+  ,"51914=2001-01-05=2001-005=2001-W01-5"+  ,"51915=2001-01-06=2001-006=2001-W01-6"+  ,"51916=2001-01-07=2001-007=2001-W01-7"+  ,"51917=2001-01-08=2001-008=2001-W02-1"+  ,"51918=2001-01-09=2001-009=2001-W02-2"+  ,"51919=2001-01-10=2001-010=2001-W02-3"+  ,"51920=2001-01-11=2001-011=2001-W02-4"+  ,"51921=2001-01-12=2001-012=2001-W02-5"+  ,"51922=2001-01-13=2001-013=2001-W02-6"+  ,"51923=2001-01-14=2001-014=2001-W02-7"+  ,"51924=2001-01-15=2001-015=2001-W03-1"+  ,"51925=2001-01-16=2001-016=2001-W03-2"+  ,"51926=2001-01-17=2001-017=2001-W03-3"+  ,"51927=2001-01-18=2001-018=2001-W03-4"+  ,"51928=2001-01-19=2001-019=2001-W03-5"+  ,"51929=2001-01-20=2001-020=2001-W03-6"+  ,"51930=2001-01-21=2001-021=2001-W03-7"+  ,"51931=2001-01-22=2001-022=2001-W04-1"+  ,"51932=2001-01-23=2001-023=2001-W04-2"+  ,"51933=2001-01-24=2001-024=2001-W04-3"+  ,"51934=2001-01-25=2001-025=2001-W04-4"+  ,"51935=2001-01-26=2001-026=2001-W04-5"+  ,"51936=2001-01-27=2001-027=2001-W04-6"+  ,"51937=2001-01-28=2001-028=2001-W04-7"+  ,"51938=2001-01-29=2001-029=2001-W05-1"+  ,"51939=2001-01-30=2001-030=2001-W05-2"+  ,"51940=2001-01-31=2001-031=2001-W05-3"+  ,"51941=2001-02-01=2001-032=2001-W05-4"+  ,"51942=2001-02-02=2001-033=2001-W05-5"+  ,"51943=2001-02-03=2001-034=2001-W05-6"+  ,"51944=2001-02-04=2001-035=2001-W05-7"+  ,"51945=2001-02-05=2001-036=2001-W06-1"+  ,"51946=2001-02-06=2001-037=2001-W06-2"+  ,"51947=2001-02-07=2001-038=2001-W06-3"+  ,"51948=2001-02-08=2001-039=2001-W06-4"+  ,"51949=2001-02-09=2001-040=2001-W06-5"+  ,"51950=2001-02-10=2001-041=2001-W06-6"+  ,"51951=2001-02-11=2001-042=2001-W06-7"+  ,"51952=2001-02-12=2001-043=2001-W07-1"+  ,"51953=2001-02-13=2001-044=2001-W07-2"+  ,"51954=2001-02-14=2001-045=2001-W07-3"+  ,"51955=2001-02-15=2001-046=2001-W07-4"+  ,"51956=2001-02-16=2001-047=2001-W07-5"+  ,"51957=2001-02-17=2001-048=2001-W07-6"+  ,"51958=2001-02-18=2001-049=2001-W07-7"+  ,"51959=2001-02-19=2001-050=2001-W08-1"+  ,"51960=2001-02-20=2001-051=2001-W08-2"+  ,"51961=2001-02-21=2001-052=2001-W08-3"+  ,"51962=2001-02-22=2001-053=2001-W08-4"+  ,"51963=2001-02-23=2001-054=2001-W08-5"+  ,"51964=2001-02-24=2001-055=2001-W08-6"+  ,"51965=2001-02-25=2001-056=2001-W08-7"+  ,"51966=2001-02-26=2001-057=2001-W09-1"+  ,"51967=2001-02-27=2001-058=2001-W09-2"+  ,"51968=2001-02-28=2001-059=2001-W09-3"+  ,"51969=2001-03-01=2001-060=2001-W09-4"+  ,"51970=2001-03-02=2001-061=2001-W09-5"+  ,"51971=2001-03-03=2001-062=2001-W09-6"+  ,"51972=2001-03-04=2001-063=2001-W09-7"+  ,"51973=2001-03-05=2001-064=2001-W10-1"+  ,"51974=2001-03-06=2001-065=2001-W10-2"+  ,"51975=2001-03-07=2001-066=2001-W10-3"+  ,"51976=2001-03-08=2001-067=2001-W10-4"+  ,"51977=2001-03-09=2001-068=2001-W10-5"+  ,"51978=2001-03-10=2001-069=2001-W10-6"+  ,"51979=2001-03-11=2001-070=2001-W10-7"+  ,"51980=2001-03-12=2001-071=2001-W11-1"+  ,"51981=2001-03-13=2001-072=2001-W11-2"+  ,"51982=2001-03-14=2001-073=2001-W11-3"+  ,"51983=2001-03-15=2001-074=2001-W11-4"+  ,"51984=2001-03-16=2001-075=2001-W11-5"+  ,"51985=2001-03-17=2001-076=2001-W11-6"+  ,"51986=2001-03-18=2001-077=2001-W11-7"+  ,"51987=2001-03-19=2001-078=2001-W12-1"+  ,"51988=2001-03-20=2001-079=2001-W12-2"+  ,"51989=2001-03-21=2001-080=2001-W12-3"+  ,"51990=2001-03-22=2001-081=2001-W12-4"+  ,"51991=2001-03-23=2001-082=2001-W12-5"+  ,"51992=2001-03-24=2001-083=2001-W12-6"+  ,"51993=2001-03-25=2001-084=2001-W12-7"+  ,"51994=2001-03-26=2001-085=2001-W13-1"+  ,"51995=2001-03-27=2001-086=2001-W13-2"+  ,"51996=2001-03-28=2001-087=2001-W13-3"+  ,"51997=2001-03-29=2001-088=2001-W13-4"+  ,"51998=2001-03-30=2001-089=2001-W13-5"+  ,"51999=2001-03-31=2001-090=2001-W13-6"+  ,"52000=2001-04-01=2001-091=2001-W13-7"+  ,"52001=2001-04-02=2001-092=2001-W14-1"+  ,"52002=2001-04-03=2001-093=2001-W14-2"+  ,"52003=2001-04-04=2001-094=2001-W14-3"+  ,"52004=2001-04-05=2001-095=2001-W14-4"+  ,"52005=2001-04-06=2001-096=2001-W14-5"+  ,"52006=2001-04-07=2001-097=2001-W14-6"+  ,"52007=2001-04-08=2001-098=2001-W14-7"+  ,"52008=2001-04-09=2001-099=2001-W15-1"+  ,"52009=2001-04-10=2001-100=2001-W15-2"+  ,"52010=2001-04-11=2001-101=2001-W15-3"+  ,"52011=2001-04-12=2001-102=2001-W15-4"+  ,"52012=2001-04-13=2001-103=2001-W15-5"+  ,"52013=2001-04-14=2001-104=2001-W15-6"+  ,"52014=2001-04-15=2001-105=2001-W15-7"+  ,"52015=2001-04-16=2001-106=2001-W16-1"+  ,"52016=2001-04-17=2001-107=2001-W16-2"+  ,"52017=2001-04-18=2001-108=2001-W16-3"+  ,"52018=2001-04-19=2001-109=2001-W16-4"+  ,"52019=2001-04-20=2001-110=2001-W16-5"+  ,"52020=2001-04-21=2001-111=2001-W16-6"+  ,"52021=2001-04-22=2001-112=2001-W16-7"+  ,"52022=2001-04-23=2001-113=2001-W17-1"+  ,"52023=2001-04-24=2001-114=2001-W17-2"+  ,"52024=2001-04-25=2001-115=2001-W17-3"+  ,"52025=2001-04-26=2001-116=2001-W17-4"+  ,"52026=2001-04-27=2001-117=2001-W17-5"+  ,"52027=2001-04-28=2001-118=2001-W17-6"+  ,"52028=2001-04-29=2001-119=2001-W17-7"+  ,"52029=2001-04-30=2001-120=2001-W18-1"+  ,"52030=2001-05-01=2001-121=2001-W18-2"+  ,"52031=2001-05-02=2001-122=2001-W18-3"+  ,"52032=2001-05-03=2001-123=2001-W18-4"+  ,"52033=2001-05-04=2001-124=2001-W18-5"+  ,"52034=2001-05-05=2001-125=2001-W18-6"+  ,"52035=2001-05-06=2001-126=2001-W18-7"+  ,"52036=2001-05-07=2001-127=2001-W19-1"+  ,"52037=2001-05-08=2001-128=2001-W19-2"+  ,"52038=2001-05-09=2001-129=2001-W19-3"+  ,"52039=2001-05-10=2001-130=2001-W19-4"+  ,"52040=2001-05-11=2001-131=2001-W19-5"+  ,"52041=2001-05-12=2001-132=2001-W19-6"+  ,"52042=2001-05-13=2001-133=2001-W19-7"+  ,"52043=2001-05-14=2001-134=2001-W20-1"+  ,"52044=2001-05-15=2001-135=2001-W20-2"+  ,"52045=2001-05-16=2001-136=2001-W20-3"+  ,"52046=2001-05-17=2001-137=2001-W20-4"+  ,"52047=2001-05-18=2001-138=2001-W20-5"+  ,"52048=2001-05-19=2001-139=2001-W20-6"+  ,"52049=2001-05-20=2001-140=2001-W20-7"+  ,"52050=2001-05-21=2001-141=2001-W21-1"+  ,"52051=2001-05-22=2001-142=2001-W21-2"+  ,"52052=2001-05-23=2001-143=2001-W21-3"+  ,"52053=2001-05-24=2001-144=2001-W21-4"+  ,"52054=2001-05-25=2001-145=2001-W21-5"+  ,"52055=2001-05-26=2001-146=2001-W21-6"+  ,"52056=2001-05-27=2001-147=2001-W21-7"+  ,"52057=2001-05-28=2001-148=2001-W22-1"+  ,"52058=2001-05-29=2001-149=2001-W22-2"+  ,"52059=2001-05-30=2001-150=2001-W22-3"+  ,"52060=2001-05-31=2001-151=2001-W22-4"+  ,"52061=2001-06-01=2001-152=2001-W22-5"+  ,"52062=2001-06-02=2001-153=2001-W22-6"+  ,"52063=2001-06-03=2001-154=2001-W22-7"+  ,"52064=2001-06-04=2001-155=2001-W23-1"+  ,"52065=2001-06-05=2001-156=2001-W23-2"+  ,"52066=2001-06-06=2001-157=2001-W23-3"+  ,"52067=2001-06-07=2001-158=2001-W23-4"+  ,"52068=2001-06-08=2001-159=2001-W23-5"+  ,"52069=2001-06-09=2001-160=2001-W23-6"+  ,"52070=2001-06-10=2001-161=2001-W23-7"+  ,"52071=2001-06-11=2001-162=2001-W24-1"+  ,"52072=2001-06-12=2001-163=2001-W24-2"+  ,"52073=2001-06-13=2001-164=2001-W24-3"+  ,"52074=2001-06-14=2001-165=2001-W24-4"+  ,"52075=2001-06-15=2001-166=2001-W24-5"+  ,"52076=2001-06-16=2001-167=2001-W24-6"+  ,"52077=2001-06-17=2001-168=2001-W24-7"+  ,"52078=2001-06-18=2001-169=2001-W25-1"+  ,"52079=2001-06-19=2001-170=2001-W25-2"+  ,"52080=2001-06-20=2001-171=2001-W25-3"+  ,"52081=2001-06-21=2001-172=2001-W25-4"+  ,"52082=2001-06-22=2001-173=2001-W25-5"+  ,"52083=2001-06-23=2001-174=2001-W25-6"+  ,"52084=2001-06-24=2001-175=2001-W25-7"+  ,"52085=2001-06-25=2001-176=2001-W26-1"+  ,"52086=2001-06-26=2001-177=2001-W26-2"+  ,"52087=2001-06-27=2001-178=2001-W26-3"+  ,"52088=2001-06-28=2001-179=2001-W26-4"+  ,"52089=2001-06-29=2001-180=2001-W26-5"+  ,"52090=2001-06-30=2001-181=2001-W26-6"+  ,"52091=2001-07-01=2001-182=2001-W26-7"+  ,"52092=2001-07-02=2001-183=2001-W27-1"+  ,"52093=2001-07-03=2001-184=2001-W27-2"+  ,"52094=2001-07-04=2001-185=2001-W27-3"+  ,"52095=2001-07-05=2001-186=2001-W27-4"+  ,"52096=2001-07-06=2001-187=2001-W27-5"+  ,"52097=2001-07-07=2001-188=2001-W27-6"+  ,"52098=2001-07-08=2001-189=2001-W27-7"+  ,"52099=2001-07-09=2001-190=2001-W28-1"+  ,"52100=2001-07-10=2001-191=2001-W28-2"+  ,"52101=2001-07-11=2001-192=2001-W28-3"+  ,"52102=2001-07-12=2001-193=2001-W28-4"+  ,"52103=2001-07-13=2001-194=2001-W28-5"+  ,"52104=2001-07-14=2001-195=2001-W28-6"+  ,"52105=2001-07-15=2001-196=2001-W28-7"+  ,"52106=2001-07-16=2001-197=2001-W29-1"+  ,"52107=2001-07-17=2001-198=2001-W29-2"+  ,"52108=2001-07-18=2001-199=2001-W29-3"+  ,"52109=2001-07-19=2001-200=2001-W29-4"+  ,"52110=2001-07-20=2001-201=2001-W29-5"+  ,"52111=2001-07-21=2001-202=2001-W29-6"+  ,"52112=2001-07-22=2001-203=2001-W29-7"+  ,"52113=2001-07-23=2001-204=2001-W30-1"+  ,"52114=2001-07-24=2001-205=2001-W30-2"+  ,"52115=2001-07-25=2001-206=2001-W30-3"+  ,"52116=2001-07-26=2001-207=2001-W30-4"+  ,"52117=2001-07-27=2001-208=2001-W30-5"+  ,"52118=2001-07-28=2001-209=2001-W30-6"+  ,"52119=2001-07-29=2001-210=2001-W30-7"+  ,"52120=2001-07-30=2001-211=2001-W31-1"+  ,"52121=2001-07-31=2001-212=2001-W31-2"+  ,"52122=2001-08-01=2001-213=2001-W31-3"+  ,"52123=2001-08-02=2001-214=2001-W31-4"+  ,"52124=2001-08-03=2001-215=2001-W31-5"+  ,"52125=2001-08-04=2001-216=2001-W31-6"+  ,"52126=2001-08-05=2001-217=2001-W31-7"+  ,"52127=2001-08-06=2001-218=2001-W32-1"+  ,"52128=2001-08-07=2001-219=2001-W32-2"+  ,"52129=2001-08-08=2001-220=2001-W32-3"+  ,"52130=2001-08-09=2001-221=2001-W32-4"+  ,"52131=2001-08-10=2001-222=2001-W32-5"+  ,"52132=2001-08-11=2001-223=2001-W32-6"+  ,"52133=2001-08-12=2001-224=2001-W32-7"+  ,"52134=2001-08-13=2001-225=2001-W33-1"+  ,"52135=2001-08-14=2001-226=2001-W33-2"+  ,"52136=2001-08-15=2001-227=2001-W33-3"+  ,"52137=2001-08-16=2001-228=2001-W33-4"+  ,"52138=2001-08-17=2001-229=2001-W33-5"+  ,"52139=2001-08-18=2001-230=2001-W33-6"+  ,"52140=2001-08-19=2001-231=2001-W33-7"+  ,"52141=2001-08-20=2001-232=2001-W34-1"+  ,"52142=2001-08-21=2001-233=2001-W34-2"+  ,"52143=2001-08-22=2001-234=2001-W34-3"+  ,"52144=2001-08-23=2001-235=2001-W34-4"+  ,"52145=2001-08-24=2001-236=2001-W34-5"+  ,"52146=2001-08-25=2001-237=2001-W34-6"+  ,"52147=2001-08-26=2001-238=2001-W34-7"+  ,"52148=2001-08-27=2001-239=2001-W35-1"+  ,"52149=2001-08-28=2001-240=2001-W35-2"+  ,"52150=2001-08-29=2001-241=2001-W35-3"+  ,"52151=2001-08-30=2001-242=2001-W35-4"+  ,"52152=2001-08-31=2001-243=2001-W35-5"+  ,"52153=2001-09-01=2001-244=2001-W35-6"+  ,"52154=2001-09-02=2001-245=2001-W35-7"+  ,"52155=2001-09-03=2001-246=2001-W36-1"+  ,"52156=2001-09-04=2001-247=2001-W36-2"+  ,"52157=2001-09-05=2001-248=2001-W36-3"+  ,"52158=2001-09-06=2001-249=2001-W36-4"+  ,"52159=2001-09-07=2001-250=2001-W36-5"+  ,"52160=2001-09-08=2001-251=2001-W36-6"+  ,"52161=2001-09-09=2001-252=2001-W36-7"+  ,"52162=2001-09-10=2001-253=2001-W37-1"+  ,"52163=2001-09-11=2001-254=2001-W37-2"+  ,"52164=2001-09-12=2001-255=2001-W37-3"+  ,"52165=2001-09-13=2001-256=2001-W37-4"+  ,"52166=2001-09-14=2001-257=2001-W37-5"+  ,"52167=2001-09-15=2001-258=2001-W37-6"+  ,"52168=2001-09-16=2001-259=2001-W37-7"+  ,"52169=2001-09-17=2001-260=2001-W38-1"+  ,"52170=2001-09-18=2001-261=2001-W38-2"+  ,"52171=2001-09-19=2001-262=2001-W38-3"+  ,"52172=2001-09-20=2001-263=2001-W38-4"+  ,"52173=2001-09-21=2001-264=2001-W38-5"+  ,"52174=2001-09-22=2001-265=2001-W38-6"+  ,"52175=2001-09-23=2001-266=2001-W38-7"+  ,"52176=2001-09-24=2001-267=2001-W39-1"+  ,"52177=2001-09-25=2001-268=2001-W39-2"+  ,"52178=2001-09-26=2001-269=2001-W39-3"+  ,"52179=2001-09-27=2001-270=2001-W39-4"+  ,"52180=2001-09-28=2001-271=2001-W39-5"+  ,"52181=2001-09-29=2001-272=2001-W39-6"+  ,"52182=2001-09-30=2001-273=2001-W39-7"+  ,"52183=2001-10-01=2001-274=2001-W40-1"+  ,"52184=2001-10-02=2001-275=2001-W40-2"+  ,"52185=2001-10-03=2001-276=2001-W40-3"+  ,"52186=2001-10-04=2001-277=2001-W40-4"+  ,"52187=2001-10-05=2001-278=2001-W40-5"+  ,"52188=2001-10-06=2001-279=2001-W40-6"+  ,"52189=2001-10-07=2001-280=2001-W40-7"+  ,"52190=2001-10-08=2001-281=2001-W41-1"+  ,"52191=2001-10-09=2001-282=2001-W41-2"+  ,"52192=2001-10-10=2001-283=2001-W41-3"+  ,"52193=2001-10-11=2001-284=2001-W41-4"+  ,"52194=2001-10-12=2001-285=2001-W41-5"+  ,"52195=2001-10-13=2001-286=2001-W41-6"+  ,"52196=2001-10-14=2001-287=2001-W41-7"+  ,"52197=2001-10-15=2001-288=2001-W42-1"+  ,"52198=2001-10-16=2001-289=2001-W42-2"+  ,"52199=2001-10-17=2001-290=2001-W42-3"+  ,"52200=2001-10-18=2001-291=2001-W42-4"+  ,"52201=2001-10-19=2001-292=2001-W42-5"+  ,"52202=2001-10-20=2001-293=2001-W42-6"+  ,"52203=2001-10-21=2001-294=2001-W42-7"+  ,"52204=2001-10-22=2001-295=2001-W43-1"+  ,"52205=2001-10-23=2001-296=2001-W43-2"+  ,"52206=2001-10-24=2001-297=2001-W43-3"+  ,"52207=2001-10-25=2001-298=2001-W43-4"+  ,"52208=2001-10-26=2001-299=2001-W43-5"+  ,"52209=2001-10-27=2001-300=2001-W43-6"+  ,"52210=2001-10-28=2001-301=2001-W43-7"+  ,"52211=2001-10-29=2001-302=2001-W44-1"+  ,"52212=2001-10-30=2001-303=2001-W44-2"+  ,"52213=2001-10-31=2001-304=2001-W44-3"+  ,"52214=2001-11-01=2001-305=2001-W44-4"+  ,"52215=2001-11-02=2001-306=2001-W44-5"+  ,"52216=2001-11-03=2001-307=2001-W44-6"+  ,"52217=2001-11-04=2001-308=2001-W44-7"+  ,"52218=2001-11-05=2001-309=2001-W45-1"+  ,"52219=2001-11-06=2001-310=2001-W45-2"+  ,"52220=2001-11-07=2001-311=2001-W45-3"+  ,"52221=2001-11-08=2001-312=2001-W45-4"+  ,"52222=2001-11-09=2001-313=2001-W45-5"+  ,"52223=2001-11-10=2001-314=2001-W45-6"+  ,"52224=2001-11-11=2001-315=2001-W45-7"+  ,"52225=2001-11-12=2001-316=2001-W46-1"+  ,"52226=2001-11-13=2001-317=2001-W46-2"+  ,"52227=2001-11-14=2001-318=2001-W46-3"+  ,"52228=2001-11-15=2001-319=2001-W46-4"+  ,"52229=2001-11-16=2001-320=2001-W46-5"+  ,"52230=2001-11-17=2001-321=2001-W46-6"+  ,"52231=2001-11-18=2001-322=2001-W46-7"+  ,"52232=2001-11-19=2001-323=2001-W47-1"+  ,"52233=2001-11-20=2001-324=2001-W47-2"+  ,"52234=2001-11-21=2001-325=2001-W47-3"+  ,"52235=2001-11-22=2001-326=2001-W47-4"+  ,"52236=2001-11-23=2001-327=2001-W47-5"+  ,"52237=2001-11-24=2001-328=2001-W47-6"+  ,"52238=2001-11-25=2001-329=2001-W47-7"+  ,"52239=2001-11-26=2001-330=2001-W48-1"+  ,"52240=2001-11-27=2001-331=2001-W48-2"+  ,"52241=2001-11-28=2001-332=2001-W48-3"+  ,"52242=2001-11-29=2001-333=2001-W48-4"+  ,"52243=2001-11-30=2001-334=2001-W48-5"+  ,"52244=2001-12-01=2001-335=2001-W48-6"+  ,"52245=2001-12-02=2001-336=2001-W48-7"+  ,"52246=2001-12-03=2001-337=2001-W49-1"+  ,"52247=2001-12-04=2001-338=2001-W49-2"+  ,"52248=2001-12-05=2001-339=2001-W49-3"+  ,"52249=2001-12-06=2001-340=2001-W49-4"+  ,"52250=2001-12-07=2001-341=2001-W49-5"+  ,"52251=2001-12-08=2001-342=2001-W49-6"+  ,"52252=2001-12-09=2001-343=2001-W49-7"+  ,"52253=2001-12-10=2001-344=2001-W50-1"+  ,"52254=2001-12-11=2001-345=2001-W50-2"+  ,"52255=2001-12-12=2001-346=2001-W50-3"+  ,"52256=2001-12-13=2001-347=2001-W50-4"+  ,"52257=2001-12-14=2001-348=2001-W50-5"+  ,"52258=2001-12-15=2001-349=2001-W50-6"+  ,"52259=2001-12-16=2001-350=2001-W50-7"+  ,"52260=2001-12-17=2001-351=2001-W51-1"+  ,"52261=2001-12-18=2001-352=2001-W51-2"+  ,"52262=2001-12-19=2001-353=2001-W51-3"+  ,"52263=2001-12-20=2001-354=2001-W51-4"+  ,"52264=2001-12-21=2001-355=2001-W51-5"+  ,"52265=2001-12-22=2001-356=2001-W51-6"+  ,"52266=2001-12-23=2001-357=2001-W51-7"+  ,"52267=2001-12-24=2001-358=2001-W52-1"+  ,"52268=2001-12-25=2001-359=2001-W52-2"+  ,"52269=2001-12-26=2001-360=2001-W52-3"+  ,"52270=2001-12-27=2001-361=2001-W52-4"+  ,"52271=2001-12-28=2001-362=2001-W52-5"+  ,"52272=2001-12-29=2001-363=2001-W52-6"+  ,"52273=2001-12-30=2001-364=2001-W52-7"+  ,"52274=2001-12-31=2001-365=2002-W01-1"+  ,"52275=2002-01-01=2002-001=2002-W01-2"+  ,"52276=2002-01-02=2002-002=2002-W01-3"+  ,"52277=2002-01-03=2002-003=2002-W01-4"+  ,"52278=2002-01-04=2002-004=2002-W01-5"+  ,"52279=2002-01-05=2002-005=2002-W01-6"+  ,"52280=2002-01-06=2002-006=2002-W01-7"+  ,""+  ,"51178=1998-12-31=1998-365=1998-W53-4"+  ,""+  ,"1998-12-31 23:59:60.5"+  ,"51178,86400.5s"+  ,"1998-12-31 15:59:60.5"+  ,"51178,86400.5s"+  ,""+  ,"2000-03-01 00:00:00"+  ,"2000-03-01 12:00:00"+  ,"2000-02-29 16:00:00"+  ,"2000-03-01 04:00:00"+  ,"2000-03-01 08:00:00"+  ,"2000-03-01 20:00:00"+  ,""+  ,"12:34:56.789"+  ,"12:34:56.789123"+  ,"12:34:56.789123456"+  ,"12:34:56.789123456789"+  ,"" ]
+ test/main/Test/TestUtil.hs view
@@ -0,0 +1,37 @@+{-# OPTIONS -fno-warn-overlapping-patterns #-}+module Test.TestUtil where++import Test.QuickCheck.Property+import Test.Tasty+import Test.Tasty.HUnit+import Test.Tasty.QuickCheck++assertFailure' :: String -> IO a+assertFailure' s = do+    assertFailure s+    return undefined++assertJust :: Maybe a -> IO a+assertJust (Just a) = return a+assertJust Nothing = assertFailure' "Nothing"++class NameTest a where+    nameTest :: String -> a -> TestTree++instance NameTest [TestTree] where+    nameTest = testGroup++instance NameTest Assertion where+    nameTest = testCase++instance NameTest Property where+    nameTest = testProperty++instance NameTest Result where+    nameTest name = nameTest name . property++instance (Arbitrary a,Show a,Testable b) => NameTest (a -> b) where+    nameTest name = nameTest name . property++tgroup :: (Show a,NameTest t) => [a] -> (a -> t) -> [TestTree]+tgroup aa f = fmap (\a -> nameTest (show a) $ f a) aa
+ test/unix/Main.hs view
@@ -0,0 +1,24 @@+module Main where++import Foreign.C.Types+import Test.Tasty+import Test.Format.Format+import Test.LocalTime.TimeZone+++tests :: TestTree+tests = testGroup "Time" [+    testGroup "Format" [+        testFormat+        ],+    testGroup "LocalTime" [+        testTimeZone+        ]+    ]++main :: IO ()+main = do+  if (toRational (1000000000000 :: CTime)) /= (1000000000000 :: Rational)+    then putStrLn "WARNING: Some tests will incorrectly fail due to a 32-bit time_t C type."+    else return ()+  defaultMain tests
+ test/unix/Test/Format/Format.hs view
@@ -0,0 +1,190 @@+{-# LANGUAGE ForeignFunctionInterface #-}++module Test.Format.Format(testFormat) where++import Data.Time+import Data.Time.Clock.POSIX+import Data.Char+import Data.Fixed+import Foreign+import Foreign.C+import Test.QuickCheck hiding (Result)+import Test.QuickCheck.Property+import Test.Tasty+import Test.Tasty.HUnit+import Test.TestUtil+import System.IO.Unsafe++{-+    size_t format_time (+    char *s, size_t maxsize,+    const char *format,+    int isdst,int gmtoff,time_t t);+-}++foreign import ccall unsafe "FormatStuff.h format_time" format_time :: CString -> CSize -> CString -> CInt -> CInt -> CString -> CTime -> IO CSize++withBuffer :: Int -> (CString -> IO CSize) -> IO String+withBuffer n f = withArray (replicate n 0) (\buffer -> do+            len <- f buffer+            peekCStringLen (buffer,fromIntegral len)+        )++unixFormatTime :: String -> TimeZone -> UTCTime -> String+unixFormatTime fmt zone time = unsafePerformIO $ withCString fmt (\pfmt -> withCString (timeZoneName zone) (\pzonename ->+        withBuffer 100 (\buffer -> format_time buffer 100 pfmt+                (if timeZoneSummerOnly zone then 1 else 0)+                (fromIntegral (timeZoneMinutes zone * 60))+                pzonename+                (fromInteger (truncate (utcTimeToPOSIXSeconds time)))+            )+        ))++locale :: TimeLocale+locale = defaultTimeLocale {dateTimeFmt = "%a %b %e %H:%M:%S %Y"}++zones :: Gen TimeZone+zones = do+    mins <- choose (-2000,2000)+    dst <- arbitrary+    hasName <- arbitrary+    let+        name = if hasName then "ZONE" else ""+    return $ TimeZone mins dst name++times :: Gen UTCTime+times = do+    day <- choose (-25000,75000)+    time <- return midnight+    return $ localTimeToUTC utc $ LocalTime (ModifiedJulianDay day) time++padN :: Int -> Char -> String -> String+padN n _ s | n <= (length s) = s+padN n c s = (replicate (n - length s) c) ++ s++unixWorkarounds :: String -> String -> String+unixWorkarounds "%_Y" s = padN 4 ' ' s+unixWorkarounds "%0Y" s = padN 4 '0' s+unixWorkarounds "%_C" s = padN 2 ' ' s+unixWorkarounds "%0C" s = padN 2 '0' s+unixWorkarounds "%_G" s = padN 4 ' ' s+unixWorkarounds "%0G" s = padN 4 '0' s+unixWorkarounds "%_f" s = padN 2 ' ' s+unixWorkarounds "%0f" s = padN 2 '0' s+unixWorkarounds fmt s | elem 'z' fmt = dropWhile isPadChar s where+    isPadChar ' ' = True+    isPadChar '0' = True+    isPadChar _ = False+unixWorkarounds _ s = s++compareFormat :: (String -> String) -> String -> TimeZone -> UTCTime -> Result+compareFormat _modUnix fmt zone _time | last fmt == 'Z' && timeZoneName zone == "" = rejected+compareFormat modUnix fmt zone time = let+    ctime = utcToZonedTime zone time+    haskellText = formatTime locale fmt ctime+    unixText = unixFormatTime fmt zone time+    expectedText = unixWorkarounds fmt (modUnix unixText)+    in assertEqualQC "" expectedText haskellText++-- as found in http://www.opengroup.org/onlinepubs/007908799/xsh/strftime.html+-- plus FgGklz+-- f not supported+-- P not always supported+-- s time-zone dependent+chars :: [Char]+chars = "aAbBcCdDeFgGhHIjklmMnprRStTuUVwWxXyYzZ%"++-- as found in "man strftime" on a glibc system. '#' is different, though+modifiers :: [String]+modifiers = ["","_","-","0","^"]++widths :: [String]+widths = ["","1","2","9","12"]++formats :: [String]+formats =  ["%G-W%V-%u","%U-%w","%W-%u"]+ ++ (do+    char <- chars+    width <- widths+    modifier <- modifiers+    return $ "%" ++ modifier ++ width ++ [char]+    )++hashformats :: [String]+hashformats = do+    char <- chars+    return $ "%#"++[char]++testCompareFormat :: [TestTree]+testCompareFormat = tgroup formats $ \fmt -> do+    time <- times+    zone <- zones+    return $ compareFormat id fmt zone time++testCompareHashFormat :: [TestTree]+testCompareHashFormat = tgroup hashformats $ \fmt -> do+    time <- times+    zone <- zones+    return $ compareFormat (fmap toLower) fmt zone time++formatUnitTest :: String -> Pico -> String -> TestTree+formatUnitTest fmt sec expected = nameTest (show fmt) $ let+    tod = TimeOfDay 0 0 (1 + sec)+    found = formatTime locale fmt tod+    in assertEqual "" expected found++testQs :: [TestTree]+testQs = [+    formatUnitTest "%q" 0 "000000000000",+    formatUnitTest "%q" 0.37 "370000000000",+    formatUnitTest "%0q" 0 "000000000000",+    formatUnitTest "%0q" 0.37 "370000000000",+    formatUnitTest "%_q" 0 "            ",+    formatUnitTest "%_q" 0.37 "37          ",+    formatUnitTest "%-q" 0 "",+    formatUnitTest "%-q" 0.37 "37",+    formatUnitTest "%1q" 0 "0",+    formatUnitTest "%1q" 0.37 "3",+    formatUnitTest "%01q" 0 "0",+    formatUnitTest "%01q" 0.37 "3",+    formatUnitTest "%_1q" 0 " ",+    formatUnitTest "%_1q" 0.37 "3",+    formatUnitTest "%-1q" 0 " ",+    formatUnitTest "%-1q" 0.37 "3",+    formatUnitTest "%5q" 0 "00000",+    formatUnitTest "%5q" 0.37 "37000",+    formatUnitTest "%05q" 0 "00000",+    formatUnitTest "%05q" 0.37 "37000",+    formatUnitTest "%_5q" 0 "     ",+    formatUnitTest "%_5q" 0.37 "37   ",+    formatUnitTest "%-5q" 0 "     ",+    formatUnitTest "%-5q" 0.37 "37   ",++    formatUnitTest "%Q" 0 ".",+    formatUnitTest "%Q" 0.37 ".37",+    formatUnitTest "%0Q" 0 ".000000000000",+    formatUnitTest "%0Q" 0.37 ".370000000000",+    formatUnitTest "%_Q" 0 ".            ",+    formatUnitTest "%_Q" 0.37 ".37          ",+    formatUnitTest "%-Q" 0 ".",+    formatUnitTest "%-Q" 0.37 ".37",+    formatUnitTest "%1Q" 0 ".0",+    formatUnitTest "%1Q" 0.37 ".3",+    formatUnitTest "%01Q" 0 ".0",+    formatUnitTest "%01Q" 0.37 ".3",+    formatUnitTest "%_1Q" 0 ". ",+    formatUnitTest "%_1Q" 0.37 ".3",+    formatUnitTest "%-1Q" 0 ". ",+    formatUnitTest "%-1Q" 0.37 ".3",+    formatUnitTest "%5Q" 0 ".00000",+    formatUnitTest "%5Q" 0.37 ".37000",+    formatUnitTest "%05Q" 0 ".00000",+    formatUnitTest "%05Q" 0.37 ".37000",+    formatUnitTest "%_5Q" 0 ".     ",+    formatUnitTest "%_5Q" 0.37 ".37   ",+    formatUnitTest "%-5Q" 0 ".     ",+    formatUnitTest "%-5Q" 0.37 ".37   "+    ]++testFormat :: TestTree+testFormat = testGroup "testFormat" $ testCompareFormat ++ testCompareHashFormat ++ testQs
+ test/unix/Test/Format/FormatStuff.c view
@@ -0,0 +1,15 @@+#include "FormatStuff.h"++size_t format_time (+    char* buffer, size_t maxsize,+    const char* format,+    int isdst,int gmtoff,char* zonename,time_t t)+{+    t += gmtoff;+    struct tm tmd;+    gmtime_r(&t,&tmd);+    tmd.tm_isdst = isdst;+    tmd.tm_gmtoff = gmtoff;+    tmd.tm_zone = zonename;+    return strftime(buffer,maxsize,format,&tmd);+}
+ test/unix/Test/Format/FormatStuff.h view
@@ -0,0 +1,6 @@+#include <time.h>++size_t format_time (+    char *s, size_t maxsize,+    const char *format,+    int isdst,int gmtoff,char* zonename,time_t t);
+ test/unix/Test/LocalTime/TimeZone.hs view
@@ -0,0 +1,17 @@+{-# OPTIONS -Wall -Werror #-}++module Test.LocalTime.TimeZone(testTimeZone) where++import Data.Time+import System.Posix.Env (putEnv)+import Test.Tasty+import Test.Tasty.HUnit++testTimeZone :: TestTree+testTimeZone = testCase "getTimeZone respects TZ env var" $ do+    let epoch = UTCTime (ModifiedJulianDay 0) 0+    putEnv "TZ=UTC+0"+    zone1 <- getTimeZone epoch+    putEnv "TZ=EST+5"+    zone2 <- getTimeZone epoch+    assertBool "zone not changed" $ zone1 /= zone2
+ test/unix/Test/TestUtil.hs view
@@ -0,0 +1,45 @@+{-# OPTIONS -fno-warn-overlapping-patterns #-}+module Test.TestUtil where++import Test.QuickCheck.Property+import Test.Tasty+import Test.Tasty.HUnit+import Test.Tasty.QuickCheck hiding (reason)++assertFailure' :: String -> IO a+assertFailure' s = do+    assertFailure s+    return undefined++assertJust :: Maybe a -> IO a+assertJust (Just a) = return a+assertJust Nothing = assertFailure' "Nothing"++class NameTest a where+    nameTest :: String -> a -> TestTree++instance NameTest [TestTree] where+    nameTest = testGroup++instance NameTest Assertion where+    nameTest = testCase++instance NameTest Property where+    nameTest = testProperty++instance NameTest Result where+    nameTest name = nameTest name . property++instance (Arbitrary a,Show a,Testable b) => NameTest (a -> b) where+    nameTest name = nameTest name . property++instance (Testable a) => NameTest (Gen a) where+    nameTest name = nameTest name . property++tgroup :: (Show a,NameTest t) => [a] -> (a -> t) -> [TestTree]+tgroup aa f = fmap (\a -> nameTest (show a) $ f a) aa++assertEqualQC :: (Show a,Eq a) => String -> a -> a -> Result+assertEqualQC _name expected found | expected == found = succeeded+assertEqualQC "" expected found = failed{reason="expected "++show expected++", found "++show found}+assertEqualQC name expected found = failed{reason=name++": expected "++show expected++", found "++show found}
time.cabal view
@@ -1,5 +1,5 @@ name:           time-version:        1.7.0.1+version:        1.8 stability:      stable license:        BSD3 license-file:   LICENSE@@ -9,7 +9,7 @@ bug-reports:    https://github.com/haskell/time/issues synopsis:       A time library description:    A time library-category:       System+category:       Time build-type:     Configure cabal-version:  >=1.10 tested-with:    GHC == 8.0.1, GHC == 7.10.3, GHC == 7.8.4@@ -23,8 +23,8 @@     lib/include/HsConfigure.h     lib/include/HsTime.h     lib/include/HsTimeConfig.h.in-    test/Test/*.c-    test/Test/*.h+    test/unix/Test/Format/*.c+    test/unix/Test/Format/*.h extra-tmp-files:     config.log     config.status@@ -62,6 +62,7 @@         Data.Time.Calendar.Julian,         Data.Time.Calendar.Easter,         Data.Time.Clock,+        Data.Time.Clock.System,         Data.Time.Clock.POSIX,         Data.Time.Clock.TAI,         Data.Time.LocalTime,@@ -74,14 +75,20 @@         Data.Time.Calendar.Days,         Data.Time.Calendar.Gregorian,         Data.Time.Calendar.JulianYearDay,-        Data.Time.Clock.Scale,-        Data.Time.Clock.UTC,-        Data.Time.Clock.CTimeval,-        Data.Time.Clock.CTimespec,-        Data.Time.Clock.UTCDiff,-        Data.Time.LocalTime.TimeZone,-        Data.Time.LocalTime.TimeOfDay,-        Data.Time.LocalTime.LocalTime,+        Data.Time.Clock.Internal.DiffTime,+        Data.Time.Clock.Internal.AbsoluteTime,+        Data.Time.Clock.Internal.NominalDiffTime,+        Data.Time.Clock.Internal.POSIXTime,+        Data.Time.Clock.Internal.UniversalTime,+        Data.Time.Clock.Internal.SystemTime,+        Data.Time.Clock.Internal.UTCTime,+        Data.Time.Clock.Internal.CTimeval,+        Data.Time.Clock.Internal.CTimespec,+        Data.Time.Clock.Internal.UTCDiff,+        Data.Time.LocalTime.Internal.TimeZone,+        Data.Time.LocalTime.Internal.TimeOfDay,+        Data.Time.LocalTime.Internal.LocalTime,+        Data.Time.LocalTime.Internal.ZonedTime,         Data.Time.Format.Parse         Data.Time.Format.Locale     include-dirs: lib/include@@ -103,9 +110,9 @@         time     main-is: ShowDefaultTZAbbreviations.hs -test-suite tests+test-suite test-main     type: exitcode-stdio-1.0-    hs-source-dirs: test+    hs-source-dirs: test/main     default-language: Haskell2010     default-extensions:         Rank2Types@@ -118,36 +125,69 @@         UndecidableInstances         ScopedTypeVariables     ghc-options: -Wall -fwarn-tabs-    c-sources: test/Test/TestFormatStuff.c     build-depends:         base,         deepseq,         time,-        QuickCheck >= 2.5.1,-        test-framework >= 0.8,-        test-framework-quickcheck2 >= 0.3,-        unix-    main-is: Test.hs+        QuickCheck,+        tasty,+        tasty-hunit,+        tasty-quickcheck+    main-is: Main.hs     other-modules:-        Test.Tests-        Test.TestTime-        Test.TestTimeRef-        Test.TestParseTime-        Test.TestMonthDay-        Test.TestMonthDayRef-        Test.TestFormat-        Test.TestEaster-        Test.TestEasterRef-        Test.TestCalendars-        Test.TestCalendarsRef-        Test.TestTAI-        Test.TestTimeZone-        Test.TestValid-        Test.LongWeekYears-        Test.LongWeekYearsRef-        Test.ConvertBack-        Test.ClipDates-        Test.ClipDatesRef-        Test.AddDays-        Test.AddDaysRef         Test.TestUtil+        Test.Calendar.AddDays+        Test.Calendar.AddDaysRef+        Test.Calendar.Calendars+        Test.Calendar.CalendarsRef+        Test.Calendar.ClipDates+        Test.Calendar.ClipDatesRef+        Test.Calendar.ConvertBack+        Test.Calendar.Easter+        Test.Calendar.EasterRef+        Test.Calendar.LongWeekYears+        Test.Calendar.LongWeekYearsRef+        Test.Calendar.MonthDay+        Test.Calendar.MonthDayRef+        Test.Calendar.Valid+        Test.Clock.Conversion+        Test.Clock.Resolution+        Test.Clock.TAI+        Test.Format.Format+        Test.Format.ParseTime+        Test.LocalTime.Time+        Test.LocalTime.TimeRef++test-suite test-unix+    if os(windows)+        buildable: False+    type: exitcode-stdio-1.0+    hs-source-dirs: test/unix+    default-language: Haskell2010+    default-extensions:+        Rank2Types+        CPP+        DeriveDataTypeable+        StandaloneDeriving+        ExistentialQuantification+        MultiParamTypeClasses+        FlexibleInstances+        UndecidableInstances+        ScopedTypeVariables+    ghc-options: -Wall -fwarn-tabs+    c-sources: test/unix/Test/Format/FormatStuff.c+    build-depends:+        base,+        deepseq,+        time,+        QuickCheck,+        tasty,+        tasty-hunit,+        tasty-quickcheck+    if !os(windows)+        build-depends: unix+    main-is: Main.hs+    other-modules:+        Test.TestUtil+        Test.Format.Format+        Test.LocalTime.TimeZone