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