]> gitweb @ CieloNegro.org - time-http.git/blob - Data/Time/RFC1123/Parsec.hs
RFC1123
[time-http.git] / Data / Time / RFC1123 / Parsec.hs
1 {-# LANGUAGE FlexibleContexts #-}
2 module Data.Time.RFC1123.Parsec
3     ( rfc1123DateAndTime
4     )
5     where
6
7 import Control.Monad
8 import Data.Fixed
9 import Data.Time
10 import Data.Time.Calendar.WeekDate
11 import Data.Time.HTTP.Common
12 import Data.Time.RFC822.Parsec
13 import Text.Parsec
14
15
16 rfc1123DateAndTime :: Stream s m Char => ParsecT s u m ZonedTime
17 rfc1123DateAndTime = dateTime
18
19 dateTime :: Stream s m Char => ParsecT s u m ZonedTime
20 dateTime = do weekDay <- optionMaybe $
21                          do w <- shortWeekDayNameP
22                             _ <- string ", "
23                             return w
24               gregDay <- date
25               case weekDay of
26                 Nothing
27                     -> return () -- No day in week exists.
28                 Just givenWD
29                     -> assertWeekDayIsGood givenWD gregDay
30               (tod, timeZone) <- rfc822time
31               let lt = LocalTime gregDay tod
32                   zt = ZonedTime lt timeZone
33               return zt
34
35 date :: Stream s m Char => ParsecT s u m Day
36 date = do day   <- read2
37           _     <- char ' '
38           month <- shortMonthNameP
39           _     <- char ' '
40           year  <- read4
41           _     <- char ' '
42           assertGregorianDateIsGood (toInteger year) month day