1 {-# LANGUAGE FlexibleContexts #-}
2 module Data.Time.RFC733.Parsec
10 import Data.Time.Calendar.WeekDate
11 import Data.Time.HTTP.Common
14 -- |This is a parsec parser for RFC 733 date and time strings.
15 rfc733DateAndTime :: Stream s m Char => ParsecT s u m ZonedTime
16 rfc733DateAndTime = dateTime
18 dateTime :: Stream s m Char => ParsecT s u m ZonedTime
19 dateTime = do weekDay <- optionMaybe $
20 do w <- try longWeekDayNameP
30 -> assertWeekDayIsGood givenWD gregDay
31 (tod, timeZone) <- time
32 let lt = LocalTime gregDay tod
33 zt = ZonedTime lt timeZone
36 date :: Stream s m Char => ParsecT s u m Day
37 date = do day <- read2
38 _ <- char '-' <|> char ' '
39 month <- try longMonthNameP
42 _ <- char '-' <|> char ' '
47 assertGregorianDateIsGood year month day
49 time :: Stream s m Char => ParsecT s u m (TimeOfDay, TimeZone)
51 _ <- char '-' <|> char ' '
55 hour :: Stream s m Char => ParsecT s u m TimeOfDay
56 hour = do hour <- read2
57 _ <- optional (char ':')
60 do _ <- optional (char ':')
62 assertTimeOfDayIsGood hour minute second
64 zone :: Stream s m Char => ParsecT s u m 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")