1 -- |This module provides functions to parse and format RFC 1123 date
4 -- The format is basically same as RFC 822, but the syntax for @date@
12 module Data.Time.RFC1123
18 import qualified Text.Parsec as P
21 import Data.Time.Calendar.WeekDate
22 import Data.Time.HTTP.Common
23 import Data.Time.RFC822 (showRFC822TimeZone)
24 import Data.Time.RFC1123.Parsec
26 -- |Format a 'ZonedTime' in RFC 1123.
27 format :: ZonedTime -> String
29 = let localTime = zonedTimeToLocalTime zonedTime
30 timeZone = zonedTimeZone zonedTime
31 (year, month, day) = toGregorian (localDay localTime)
32 (_, _, week) = toWeekDate (localDay localTime)
33 timeOfDay = localTimeOfDay localTime
35 concat [ shortWeekDayName week
39 , shortMonthName month
43 , show2 (todHour timeOfDay)
45 , show2 (todMin timeOfDay)
47 , show2 (floor (todSec timeOfDay))
49 , showRFC822TimeZone timeZone
52 -- |Parse an RFC 1123 date and time string. When the string can't be
53 -- parsed, it returns 'Nothing'.
54 parse :: String -> Maybe ZonedTime
55 parse src = case P.parse p "" src of
59 p = do zt <- rfc1123DateAndTime