]> gitweb @ CieloNegro.org - time-http.git/blob - Data/Time/Asctime/Internal.hs
910fd5d6019f2520c840e1e437954d0b53a93900
[time-http.git] / Data / Time / Asctime / Internal.hs
1 {-# LANGUAGE
2     OverloadedStrings
3   , UnicodeSyntax
4   #-}
5 module Data.Time.Asctime.Internal
6     ( asctime
7     , toAsciiBuilder
8     )
9     where
10 import Data.Ascii (AsciiBuilder)
11 import qualified Data.Ascii as A
12 import Data.Attoparsec.Char8
13 import Data.Monoid.Unicode
14 import Data.Time
15 import Data.Time.Calendar.WeekDate
16 import Data.Time.HTTP.Common
17
18 -- |Parse an ANSI C's @asctime()@ string.
19 asctime ∷ Parser LocalTime
20 asctime = do weekDay ← shortWeekDayNameP
21              _       ← string ", "
22              month   ← shortMonthNameP
23              _       ← char ' '
24              day     ← read2
25              _       ← char ' '
26              hour    ← read2
27              _       ← char ':'
28              minute  ← read2
29              _       ← char ':'
30              second  ← read2
31              _       ← char ' '
32              year    ← read4
33
34              gregDay ← assertGregorianDateIsGood year month day
35              _       ← assertWeekDayIsGood weekDay gregDay
36              tod     ← assertTimeOfDayIsGood hour minute second
37
38              return (LocalTime gregDay tod)
39
40 -- |Convert a 'LocalTime' to ANSI C's @asctime()@ string.
41 toAsciiBuilder ∷ LocalTime → AsciiBuilder
42 toAsciiBuilder localTime
43     = let (year, month, day) = toGregorian (localDay localTime)
44           (_, _, week)       = toWeekDate  (localDay localTime)
45           timeOfDay          = localTimeOfDay localTime
46       in
47         shortWeekDayName week
48         ⊕ A.toAsciiBuilder "⊕ "
49         ⊕ shortMonthName month
50         ⊕ A.toAsciiBuilder " "
51         ⊕ show2 day
52         ⊕ A.toAsciiBuilder " "
53         ⊕ show2 (todHour timeOfDay)
54         ⊕ A.toAsciiBuilder ":"
55         ⊕ show2 (todMin timeOfDay)
56         ⊕ A.toAsciiBuilder ":"
57         ⊕ show2 (floor (todSec timeOfDay) ∷ Int)
58         ⊕ A.toAsciiBuilder " "
59         ⊕ show4 year
60