time-http-0.2: Data/Time/Asctime.hs
{-# LANGUAGE
UnicodeSyntax
#-}
-- |This module provides functions for ANSI C's asctime() format.
--
-- ANSI C's asctime() format looks like:
--
-- @Wdy Mon [D]D HH:MM:SS YYYY@
--
-- The exact syntax is as follows:
--
-- > date-time ::= wday SP month SP day SP time SP year
-- > wday ::= "Mon" | "Tue" | "Wed" | "Thu"
-- > | "Fri" | "Sat" | "Sun"
-- > month ::= "Jan" | "Feb" | "Mar" | "Apr"
-- > | "May" | "Jun" | "Jul" | "Aug"
-- > | "Sep" | "Oct" | "Nov" | "Dec"
-- > day ::= 2DIGIT | SP 1DIGIT
-- > time ::= 2DIGIT ':' 2DIGIT [':' 2DIGIT]
-- > year ::= 4DIGIT
--
-- As you can see, it has no time zone info. "Data.Time.HTTP" will
-- treat it as UTC.
module Data.Time.Asctime
( -- * Formatting
toAscii
, toAsciiBuilder
-- * Parsing
, fromAscii
, asctime
)
where
import Data.Ascii (Ascii)
import qualified Data.Ascii as A
import qualified Data.Attoparsec.Char8 as P
import Data.Time
import Data.Time.Asctime.Internal
import Prelude.Unicode
-- |Convert a 'LocalTime' to ANSI C's @asctime()@ string.
toAscii ∷ LocalTime → Ascii
toAscii = A.fromAsciiBuilder ∘ toAsciiBuilder
-- |Parse an ANSI C's @asctime()@ string. When the string can't be
-- parsed, it returns @'Left' err@.
fromAscii ∷ Ascii → Either String LocalTime
fromAscii = P.parseOnly p ∘ A.toByteString
where
p = do zt ← asctime
P.endOfInput
return zt