module Data.Time.W3CDateTime ( W3CDateTime ) where import Data.Convertible import Data.Fixed import Data.Time import Data.Typeable -- This data type is /partially ordered/ so we can't make it an -- instance of Ord (e.g. "2010" and "2010-01" can't be compared). data W3CDateTime = W3CDateTime { w3cYear :: !Integer , w3cMonth :: !(Maybe Int) , w3cDay :: !(Maybe Int) , w3cHour :: !(Maybe Int) , w3cMinute :: !(Maybe Int) , w3cSecond :: !(Maybe Pico) , w3cTimeZone :: !(Maybe TimeZone) } deriving (Show, Eq, Typeable) empty :: W3CDateTime empty = W3CDateTime { w3cYear = 0 , w3cMonth = Nothing , w3cDay = Nothing , w3cHour = Nothing , w3cMinute = Nothing , w3cSecond = Nothing , w3cTimeZone = Nothing } instance Convertible Day W3CDateTime where safeConvert day = case toGregorian day of (y, m, d) -> return empty { w3cYear = y , w3cMonth = Just m , w3cDay = Just d } instance Convertible W3CDateTime Day where safeConvert w3c = do let y = w3cYear w3c m <- case w3cMonth w3c of Just m -> return m Nothing -> convError "No month info" w3c d <- case w3cDay w3c of Just d -> return d Nothing -> convError "No day info" w3c return $ fromGregorian y m d