module Matterhorn.TimeUtils
( lookupLocalTimeZone
, startOfDay
, justAfter, justBefore
, asLocalTime
, localTimeText
, originTime
)
where
import Prelude ()
import Matterhorn.Prelude
import qualified Data.Text as T
import Data.Time.Clock ( UTCTime(..) )
import Data.Time.Format ( formatTime, defaultTimeLocale )
import Data.Time.LocalTime ( LocalTime(..), TimeOfDay(..) )
import Data.Time.LocalTime.TimeZone.Olson ( getTimeZoneSeriesFromOlsonFile )
import Data.Time.LocalTime.TimeZone.Series ( localTimeToUTC'
, utcToLocalTime')
import Network.Mattermost.Types ( ServerTime(..) )
lookupLocalTimeZone :: IO TimeZoneSeries
lookupLocalTimeZone = getTimeZoneSeriesFromOlsonFile "/etc/localtime"
justAfter :: ServerTime -> ServerTime
justAfter = ServerTime . justAfterUTC . withServerTime
where justAfterUTC time = let UTCTime d t = time in UTCTime d (succ t)
justBefore :: ServerTime -> ServerTime
justBefore = ServerTime . justBeforeUTC . withServerTime
where justBeforeUTC time = let UTCTime d t = time in UTCTime d (pred t)
startOfDay :: Maybe TimeZoneSeries -> UTCTime -> UTCTime
startOfDay Nothing time = let UTCTime d _ = time in UTCTime d 0
startOfDay (Just tz) time = let lt = utcToLocalTime' tz time
ls = LocalTime (localDay lt) (TimeOfDay 0 0 0)
in localTimeToUTC' tz ls
asLocalTime :: TimeZoneSeries -> UTCTime -> LocalTime
asLocalTime = utcToLocalTime'
localTimeText :: Text -> LocalTime -> Text
localTimeText fmt time = T.pack $ formatTime defaultTimeLocale (T.unpack fmt) time
originTime :: UTCTime
originTime = UTCTime (toEnum 0) 0