module Timestamp where {--- - Timestamp Module - - Functions related to getting and using timestamps. - - Shaun Kerr -} import Data.Time.LocalTime import Data.Time.Format -- Internal Date Representation data Timestamp = Ts Integer Integer Integer deriving Show -- Previews Start on the 20th isPreviewSeason :: Timestamp -> Bool isPreviewSeason (Ts x _ _) = x >= 20 -- True // False if first date is in the future -- relative to the second date. inFuture :: Timestamp -> Timestamp -> Bool inFuture (Ts d1 m1 y1) (Ts d2 m2 y2) | y1 /= y2 = y1 > y2 | m1 /= m2 = m1 > m2 | d1 /= d2 = d1 > d2 | otherwise = False -- How many months in the future the first date is -- relative from the second date. -- returns 0 otherwise. monthsSince :: Timestamp -> Timestamp -> Integer monthsSince (Ts d1 m1 y1) (Ts d2 m2 y2) | t1 `inFuture` t2 = (12 * (y1 - y2)) + (m1 - m2) | otherwise = 0 where t1 = Ts d1 m1 y1 t2 = Ts d2 m2 y2 -- Helper, format Integer representation to Timestamp toTS :: (Integer, Integer, Integer) -> Timestamp toTS (y,m,d) = Ts d m y -- IO Function, get the current date as a [Char] getCurrentTime :: IO [Char] getCurrentTime = getZonedTime >>= return . (formatTime defaultTimeLocale "%Y %m %d") -- Helper, format the [Char] as triple Integer fmtCurrentTime :: [Char] -> (Integer, Integer, Integer) fmtCurrentTime n = (\[a,b,c] -> (a,b,c)) iTime where iTime = map (\x -> read x :: Integer) $ words n -- Hide away some ugly steps. Not sure we ever -- use the other two so can probably compact this. getTimestamp :: [Char] -> Timestamp getTimestamp x = toTS . fmtCurrentTime $ x