module Canteven.ParseDate.Types (
LocalTimeAndOffset(..),
ltaoInTimeZone,
ltaoInTimeZoneTZ
) where
import Data.Time (UTCTime, ParseTime (buildTime))
import Data.Time.LocalTime (LocalTime, TimeZone, localTimeToUTC)
import Data.Time.LocalTime.TimeZone.Series (TimeZoneSeries, utcToLocalTime')
import Data.Time.Zones (TZ, utcToLocalTimeTZ)
data LocalTimeAndOffset = LocalTimeAndOffset {
ltaoLocalTime :: LocalTime
, ltaoOffset :: Maybe TimeZone
} deriving (Read, Show, Eq)
instance ParseTime LocalTimeAndOffset where
buildTime l xs =
LocalTimeAndOffset (buildTime l $ filter (not . isZoneInfo) xs)
maybeZone
where
isZoneInfo ('z',_) = True
isZoneInfo ('Z',"") = False
isZoneInfo ('Z',_) = True
isZoneInfo _ = False
zoneLetters = filter isZoneInfo xs
maybeZone | null zoneLetters = Nothing
| otherwise = Just $ buildTime l zoneLetters
ltaoInTimeZone :: TimeZoneSeries -> LocalTimeAndOffset -> LocalTime
ltaoInTimeZone = ltaoInTimeZoneConvert utcToLocalTime'
ltaoInTimeZoneTZ :: TZ -> LocalTimeAndOffset -> LocalTime
ltaoInTimeZoneTZ = ltaoInTimeZoneConvert utcToLocalTimeTZ
ltaoInTimeZoneConvert :: (a -> UTCTime -> LocalTime) -> a -> LocalTimeAndOffset -> LocalTime
ltaoInTimeZoneConvert _ _ (LocalTimeAndOffset lTime Nothing) = lTime
ltaoInTimeZoneConvert convert tz (LocalTimeAndOffset lTime (Just off)) =
convert tz utc
where
utc = localTimeToUTC off lTime