HQu-0.0.0.0: src/Q/Time.hs
{-# LANGUAGE OverloadedStrings #-}
module Q.Time
( module Q.Time.Date
, module Q.Time.DayCounter
, parseDay
, parseLocalTime
) where
import qualified Data.ByteString as B
import Data.ByteString.Char8 (unpack)
import Data.Csv (FromField (..), ToField (..), record,
toField, (.!), (.:))
import Data.Maybe (fromJust)
import Data.Time
import Data.Time.Format
import Data.Time.Format.ISO8601
import Data.Vector (Vector, toList)
import Q.Time.Date
import Q.Time.DayCounter
-- | Converts a shortened ISO08601 date string, or datetime to a 'LocalTime'.
-- If the string doesn't contain time then 'midnight' is used.
parseLocalTime :: String -> Maybe LocalTime
parseLocalTime iso_datetime =
if length iso_datetime == 8 then do
day <- formatParseM dayFormat' iso_datetime
return $ LocalTime day midnight
else
formatParseM localTimeFormat' iso_datetime
-- | Converts a shortned ISO08601 date to a 'Day'
parseDay :: String -> Maybe Day
parseDay = formatParseM dayFormat'
-- | basic ISO08601 date/time format.
localTimeFormat' = localTimeFormat dayFormat' timeFormat'
-- | basic ISO08601 time format.
timeFormat' = timeOfDayFormat BasicFormat
-- | basic ISO08601 day format.
dayFormat' = calendarFormat BasicFormat
-- | Format a date as an basic ISO08601 format.
dateToString :: LocalTime -> String
dateToString date = formatShow localTimeFormat' date
instance ToField Day where
toField d = toField $ formatShow dayFormat' d
instance FromField Day where
parseField s = pure $ fromJust (parseDay (unpack s))