packages feed

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