module System.Time.Parse (parseCalendarTime) where import Data.List import Data.Maybe import System.Locale import System.Time import Data.Time import Data.Time.Calendar.OrdinalDate import Data.Time.Parse -- | Parse a date string to a 'CalendarTime'. -- This is the same as 'parseTime', but specialized to 'CalendarTime' -- for compatibility with earlier versions of the parsedate package. parseCalendarTime :: TimeLocale -- ^ Time locale -> String -- ^ Date format -> String -- ^ String to parse -> Maybe CalendarTime -- ^ 'Nothing' if parsing failed. parseCalendarTime l f s = fmap zonedTimeToCalendarTime (parseTime l f s) zonedTimeToCalendarTime :: ZonedTime -> CalendarTime zonedTimeToCalendarTime t = CalendarTime { ctYear = fromInteger y, ctMonth = toEnum (mo-1), ctDay = d, ctHour = todHour time, ctMin = todMin time, ctSec = s, ctPicosec = truncate (10^12 * sd), ctWDay = toEnum (snd (sundayStartWeek day)), ctYDay = snd (toOrdinalDate day), ctTZName = timeZoneName tz, ctTZ = 60 * timeZoneMinutes tz, ctIsDST = timeZoneSummerOnly tz } where day = localDay (zonedTimeToLocalTime t) (y,mo,d) = toGregorian day time = localTimeOfDay (zonedTimeToLocalTime t) (s,sd) = properFraction (todSec time) tz = zonedTimeZone t