1 {-# LANGUAGE FlexibleContexts #-}
2 module Data.Time.RFC733.Internal
9 import Data.Time.Calendar.WeekDate
10 import Data.Time.HTTP.Common
12 -- |This is a parsec parser for RFC 733 date and time strings.
13 rfc733DateAndTime :: Stream s m Char => ParsecT s u m ZonedTime
14 rfc733DateAndTime = dateTime
16 dateTime :: Stream s m Char => ParsecT s u m ZonedTime
17 dateTime = do weekDay <- optionMaybe $
18 do w <- try longWeekDayNameP
28 -> assertWeekDayIsGood givenWD gregDay
29 (tod, timeZone) <- time
30 let lt = LocalTime gregDay tod
31 zt = ZonedTime lt timeZone
34 date :: Stream s m Char => ParsecT s u m Day
35 date = do day <- read2
36 _ <- char '-' <|> char ' '
37 month <- try longMonthNameP
40 _ <- char '-' <|> char ' '
45 assertGregorianDateIsGood year month day
47 time :: Stream s m Char => ParsecT s u m (TimeOfDay, TimeZone)
49 _ <- char '-' <|> char ' '
53 hour :: Stream s m Char => ParsecT s u m TimeOfDay
54 hour = do hour <- read2
55 _ <- optional (char ':')
58 do _ <- optional (char ':')
60 assertTimeOfDayIsGood hour minute second
62 zone :: Stream s m Char => ParsecT s u m TimeZone
63 zone = choice [ string "GMT" >> return (TimeZone 0 False "GMT")
65 >> choice [ string "ST" >> return (TimeZone ((-3) * 60 - 30) False "NST")
66 , return (TimeZone (1 * 60) False "N")
69 >> choice [ string "ST" >> return (TimeZone ((-4) * 60) False "AST")
70 , string "DT" >> return (TimeZone ((-3) * 60) False "AST")
71 , return (TimeZone ((-1) * 60) False "A")
74 >> choice [ string "ST" >> return (TimeZone ((-5) * 60) False "EST")
75 , string "DT" >> return (TimeZone ((-4) * 60) True "EDT")
78 >> choice [ string "ST" >> return (TimeZone ((-6) * 60) False "CST")
79 , string "DT" >> return (TimeZone ((-5) * 60) True "CDT")
82 >> choice [ string "ST" >> return (TimeZone ((-7) * 60) False "MST")
83 , string "DT" >> return (TimeZone ((-6) * 60) True "MDT")
84 , return (TimeZone ((-12) * 60) False "M")
87 >> choice [ string "ST" >> return (TimeZone ((-8) * 60) False "PST")
88 , string "DT" >> return (TimeZone ((-7) * 60) True "PDT")
91 >> choice [ string "ST" >> return (TimeZone ((-9) * 60) False "YST")
92 , string "DT" >> return (TimeZone ((-8) * 60) True "YDT")
93 , return (TimeZone ( 12 * 60) False "Y")
96 >> choice [ string "ST" >> return (TimeZone ((-10) * 60) False "HST")
97 , string "DT" >> return (TimeZone (( -9) * 60) True "HDT")
100 >> choice [ string "ST" >> return (TimeZone ((-11) * 60) False "BST")
101 , string "DT" >> return (TimeZone ((-10) * 60) True "BDT")
103 , char 'Z' >> return (TimeZone 0 False "Z")