module Data.Time.ISO8601
( formatISO8601
, formatISO8601Millis
, formatISO8601Micros
, formatISO8601Nanos
, formatISO8601Picos
, formatISO8601Javascript
, parseISO8601
) where
import Data.Time.Clock (UTCTime)
import Data.Time.Format (formatTime, parseTime)
import System.Locale (defaultTimeLocale)
import Control.Applicative ((<|>))
formatISO8601 :: UTCTime -> String
formatISO8601 t = formatTime defaultTimeLocale "%FT%T%QZ" t
formatPadded :: UTCTime -> String
formatPadded t
| length str == 19 = str ++ ".000000000000"
| otherwise = str ++ "000000000000"
where
str = formatTime defaultTimeLocale "%FT%T%Q" t
formatISO8601Millis :: UTCTime -> String
formatISO8601Millis t = take 23 (formatPadded t) ++ "Z"
formatISO8601Micros :: UTCTime -> String
formatISO8601Micros t = take 26 (formatPadded t) ++ "Z"
formatISO8601Nanos :: UTCTime -> String
formatISO8601Nanos t = take 29 (formatPadded t) ++ "Z"
formatISO8601Picos :: UTCTime -> String
formatISO8601Picos t = take 32 (formatPadded t) ++ "Z"
formatISO8601Javascript :: UTCTime -> String
formatISO8601Javascript = formatISO8601Millis
parseISO8601 :: String -> Maybe UTCTime
parseISO8601 t = parseTime defaultTimeLocale "%FT%T%QZ" t <|>
parseTime defaultTimeLocale "%FT%T%Q%z" t