module Data.Time.RFC3339 (
RFC3339(showRFC3339, readRFC3339)
) where
#if __GLASGOW_HASKELL__ < 710
import System.Locale
#endif
import Data.Time.Format
import Data.Time.LocalTime
import Data.Time.Calendar
import Data.Maybe
test1 = "1985-04-12T23:20:50.52Z"
test2 = "1996-12-19T16:39:57-08:00"
test3 = "1990-12-31T23:59:60Z"
test4 = "1990-12-31T15:59:60-08:00"
test5 = "1937-01-01T12:00:27.87+00:20"
tests :: [String]
tests = [test1, test2, test3, test4, test5]
testParse = length (catMaybes (map readRFC3339 tests)) == length tests
class RFC3339 a where
showRFC3339 :: ZonedTime -> a
readRFC3339 :: a -> Maybe ZonedTime
formatRFC3339 :: [a]
instance RFC3339 String where
showRFC3339 zt@(ZonedTime lt z) =
formatTime defaultTimeLocale "%FT%T" zt ++ printZone
where
timeZoneStr = timeZoneOffsetString z
printZone = if timeZoneStr == timeZoneOffsetString utc
then "Z"
else take 3 timeZoneStr ++ ":" ++ drop 3 timeZoneStr
formatRFC3339 = [ "%FT%TZ"
, "%FT%T%z"
, "%FT%T%Q%z"
, "%FT%T%QZ"
]
readRFC3339 t = foldr (tryP t) Nothing $ map p formatRFC3339
where
p :: String -> String -> Maybe ZonedTime
p f s = parseTime defaultTimeLocale f s
tryP :: String -> (String -> Maybe a) -> Maybe a -> Maybe a
tryP s f acc | isJust acc = acc
| otherwise = f s
showTime :: IO String
showTime = getZonedTime >>= return . showRFC3339