--- /dev/null
+{-# LANGUAGE FlexibleContexts #-}
+module Data.Time.RFC1123.Parsec
+ ( rfc1123DateAndTime
+ )
+ where
+
+import Control.Monad
+import Data.Fixed
+import Data.Time
+import Data.Time.Calendar.WeekDate
+import Data.Time.HTTP.Common
+import Data.Time.RFC822.Parsec
+import Text.Parsec
+
+
+rfc1123DateAndTime :: Stream s m Char => ParsecT s u m ZonedTime
+rfc1123DateAndTime = dateTime
+
+dateTime :: Stream s m Char => ParsecT s u m ZonedTime
+dateTime = do weekDay <- optionMaybe $
+ do w <- shortWeekDayNameP
+ _ <- string ", "
+ return w
+ gregDay <- date
+ case weekDay of
+ Nothing
+ -> return () -- No day in week exists.
+ Just givenWD
+ -> assertWeekDayIsGood givenWD gregDay
+ (tod, timeZone) <- rfc822time
+ let lt = LocalTime gregDay tod
+ zt = ZonedTime lt timeZone
+ return zt
+
+date :: Stream s m Char => ParsecT s u m Day
+date = do day <- read2
+ _ <- char ' '
+ month <- shortMonthNameP
+ _ <- char ' '
+ year <- read4
+ _ <- char ' '
+ assertGregorianDateIsGood (toInteger year) month day