5 module Data.Time.RFC733.Internal
9 import Control.Applicative
10 import Data.Attoparsec.Char8
12 import Data.Time.HTTP.Common
14 -- |Parse RFC 733 date and time strings.
15 rfc733DateAndTime ∷ Parser ZonedTime
16 rfc733DateAndTime = dateTime
18 dateTime ∷ Parser ZonedTime
19 dateTime = do weekDay ← optionMaybe $
20 do w ← longWeekDayNameP
30 → assertWeekDayIsGood givenWD gregDay
31 (tod, timeZone) ← time
32 let lt = LocalTime gregDay tod
33 zt = ZonedTime lt timeZone
38 _ ← char '-' <|> char ' '
39 month ← try longMonthNameP
42 _ ← char '-' <|> char ' '
47 assertGregorianDateIsGood year month day
49 time ∷ Parser (TimeOfDay, TimeZone)
51 _ ← char '-' <|> char ' '
55 hms ∷ Parser TimeOfDay
57 _ ← optional (char ':')
60 do _ ← optional (char ':')
62 assertTimeOfDayIsGood hour minute second
64 zone ∷ Parser TimeZone
65 zone = choice [ string "GMT" *> return (TimeZone 0 False "GMT")
67 *> choice [ string "ST" *> return (TimeZone ((-3) * 60 - 30) False "NST")
68 , return (TimeZone (1 * 60) False "N")
71 *> choice [ string "ST" *> return (TimeZone ((-4) * 60) False "AST")
72 , string "DT" *> return (TimeZone ((-3) * 60) False "AST")
73 , return (TimeZone ((-1) * 60) False "A")
76 *> choice [ string "ST" *> return (TimeZone ((-5) * 60) False "EST")
77 , string "DT" *> return (TimeZone ((-4) * 60) True "EDT")
80 *> choice [ string "ST" *> return (TimeZone ((-6) * 60) False "CST")
81 , string "DT" *> return (TimeZone ((-5) * 60) True "CDT")
84 *> choice [ string "ST" *> return (TimeZone ((-7) * 60) False "MST")
85 , string "DT" *> return (TimeZone ((-6) * 60) True "MDT")
86 , return (TimeZone ((-12) * 60) False "M")
89 *> choice [ string "ST" *> return (TimeZone ((-8) * 60) False "PST")
90 , string "DT" *> return (TimeZone ((-7) * 60) True "PDT")
93 *> choice [ string "ST" *> return (TimeZone ((-9) * 60) False "YST")
94 , string "DT" *> return (TimeZone ((-8) * 60) True "YDT")
95 , return (TimeZone ( 12 * 60) False "Y")
98 *> choice [ string "ST" *> return (TimeZone ((-10) * 60) False "HST")
99 , string "DT" *> return (TimeZone (( -9) * 60) True "HDT")
102 *> choice [ string "ST" *> return (TimeZone ((-11) * 60) False "BST")
103 , string "DT" *> return (TimeZone ((-10) * 60) True "BDT")
105 , char 'Z' *> return (TimeZone 0 False "Z")