3 , MultiParamTypeClasses
8 -- |This module provides functions for ANSI C's asctime() format.
10 -- ANSI C's asctime() format looks like:
12 -- @Wdy Mon [D]D HH:MM:SS YYYY@
14 -- The exact syntax is as follows:
16 -- > date-time ::= wday SP month SP day SP time SP year
17 -- > wday ::= "Mon" | "Tue" | "Wed" | "Thu"
18 -- > | "Fri" | "Sat" | "Sun"
19 -- > month ::= "Jan" | "Feb" | "Mar" | "Apr"
20 -- > | "May" | "Jun" | "Jul" | "Aug"
21 -- > | "Sep" | "Oct" | "Nov" | "Dec"
22 -- > day ::= 2DIGIT | SP 1DIGIT
23 -- > time ::= 2DIGIT ':' 2DIGIT [':' 2DIGIT]
26 -- As you can see, it has no time zone info. "Data.Time.HTTP" will
28 module Data.Time.Asctime
33 import Control.Applicative
34 import Data.Ascii (Ascii, AsciiBuilder)
35 import qualified Data.Ascii as A
36 import Data.Attoparsec.Char8
37 import Data.Convertible.Base
38 import Data.Monoid.Unicode
41 import Data.Time.Calendar.WeekDate
42 import Data.Time.HTTP.Common
43 import Prelude.Unicode
45 -- |The phantom type for conversion between ANSI C's @asctime()@
46 -- string and 'LocalTime'.
48 -- >>> convertSuccess (LocalTime (ModifiedJulianDay 49662) (TimeOfDay 8 49 37))
49 -- Tagged "Sun Nov 6 08:49:37 1994"
52 instance ConvertSuccess LocalTime (Tagged Asctime Ascii) where
53 {-# INLINE convertSuccess #-}
54 convertSuccess = (A.fromAsciiBuilder <$>) ∘ cs
56 instance ConvertSuccess LocalTime (Tagged Asctime AsciiBuilder) where
57 {-# INLINE convertSuccess #-}
58 convertSuccess = Tagged ∘ toAsciiBuilder
60 instance ConvertAttempt (Tagged Asctime Ascii) LocalTime where
61 {-# INLINE convertAttempt #-}
62 convertAttempt = parseAttempt' asctime ∘ untag
64 -- |Parse an ANSI C's @asctime()@ string.
65 asctime ∷ Parser LocalTime
66 asctime = do weekDay ← shortWeekDayNameP
68 month ← shortMonthNameP
80 gregDay ← assertGregorianDateIsGood year month day
81 _ ← assertWeekDayIsGood weekDay gregDay
82 tod ← assertTimeOfDayIsGood hour minute second
84 return (LocalTime gregDay tod)
86 toAsciiBuilder ∷ LocalTime → AsciiBuilder
87 toAsciiBuilder localTime
88 = let (year, month, day) = toGregorian (localDay localTime)
89 (_, _, week) = toWeekDate (localDay localTime)
90 timeOfDay = localTimeOfDay localTime
93 ⊕ A.toAsciiBuilder " "
94 ⊕ shortMonthName month
95 ⊕ A.toAsciiBuilder " "
97 ⊕ A.toAsciiBuilder " "
98 ⊕ show2 (todHour timeOfDay)
99 ⊕ A.toAsciiBuilder ":"
100 ⊕ show2 (todMin timeOfDay)
101 ⊕ A.toAsciiBuilder ":"
102 ⊕ show2 (floor (todSec timeOfDay) ∷ Int)
103 ⊕ A.toAsciiBuilder " "
106 deriveAttempts [ ([t| LocalTime |], [t| Tagged Asctime Ascii |])
107 , ([t| LocalTime |], [t| Tagged Asctime AsciiBuilder |])