1 module Data.Time.RFC822
10 import qualified Text.Parsec as P
13 import Data.Time.Calendar.WeekDate
14 import Data.Time.HTTP.Common
15 import Data.Time.RFC822.Parsec
19 date-time = [ day "," ] date time ; dd mm yy
22 day = "Mon" / "Tue" / "Wed" / "Thu"
23 / "Fri" / "Sat" / "Sun"
25 date = 1*2DIGIT month 2DIGIT ; day month year
28 month = "Jan" / "Feb" / "Mar" / "Apr"
29 / "May" / "Jun" / "Jul" / "Aug"
30 / "Sep" / "Oct" / "Nov" / "Dec"
32 time = hour zone ; ANSI and Military
34 hour = 2DIGIT ":" 2DIGIT [":" 2DIGIT]
37 zone = "UT" / "GMT" ; Universal Time
39 / "EST" / "EDT" ; Eastern: - 5/ - 4
40 / "CST" / "CDT" ; Central: - 6/ - 5
41 / "MST" / "MDT" ; Mountain: - 7/ - 6
42 / "PST" / "PDT" ; Pacific: - 8/ - 7
43 / 1ALPHA ; Military: Z = UT;
46 / ( ("+" / "-") 4DIGIT ) ; Local differential
50 format :: ZonedTime -> String
52 = let localTime = zonedTimeToLocalTime zonedTime
53 timeZone = zonedTimeZone zonedTime
54 (year, month, day) = toGregorian (localDay localTime)
55 (_, _, week) = toWeekDate (localDay localTime)
56 timeOfDay = localTimeOfDay localTime
58 concat [ shortWeekDayName week
62 , shortMonthName month
64 , show2 (year `mod` 100)
66 , show2 (todHour timeOfDay)
68 , show2 (todMin timeOfDay)
70 , show2 (floor (todSec timeOfDay))
72 , showRFC822TimeZone timeZone
75 showRFC822TimeZone :: TimeZone -> String
77 | timeZoneMinutes tz == 0 = "GMT"
78 | otherwise = show4digitsTZ tz
80 parse :: String -> Maybe ZonedTime
81 parse src = case P.parse p "" src of
85 p = do zt <- rfc822DateAndTime