]> gitweb @ CieloNegro.org - time-http.git/blob - Data/Time/RFC822.hs
c31c2448de6c2914938daa1c5ea1ed436938271c
[time-http.git] / Data / Time / RFC822.hs
1 module Data.Time.RFC822
2     ( format
3     , parse
4     )
5     where
6
7 import qualified Text.Parsec as P
8
9 import Data.Time
10 import Data.Time.Calendar.WeekDate
11 import Data.Time.HTTP.Common
12 import Data.Time.RFC822.Parsec
13
14
15 {-
16      date-time   =  [ day "," ] date time        ; dd mm yy
17                                                  ;  hh:mm:ss zzz
18
19      day         =  "Mon"  / "Tue" /  "Wed"  / "Thu"
20                  /  "Fri"  / "Sat" /  "Sun"
21
22      date        =  1*2DIGIT month 2DIGIT        ; day month year
23                                                  ;  e.g. 20 Jun 82
24
25      month       =  "Jan"  /  "Feb" /  "Mar"  /  "Apr"
26                  /  "May"  /  "Jun" /  "Jul"  /  "Aug"
27                  /  "Sep"  /  "Oct" /  "Nov"  /  "Dec"
28
29      time        =  hour zone                    ; ANSI and Military
30
31      hour        =  2DIGIT ":" 2DIGIT [":" 2DIGIT]
32                                                  ; 00:00:00 - 23:59:59
33
34      zone        =  "UT"  / "GMT"                ; Universal Time
35                                                  ; North American : UT
36                  /  "EST" / "EDT"                ;  Eastern:  - 5/ - 4
37                  /  "CST" / "CDT"                ;  Central:  - 6/ - 5
38                  /  "MST" / "MDT"                ;  Mountain: - 7/ - 6
39                  /  "PST" / "PDT"                ;  Pacific:  - 8/ - 7
40                  /  1ALPHA                       ; Military: Z = UT;
41                                                  ;  A:-1; (J not used)
42                                                  ;  M:-12; N:+1; Y:+12
43                  / ( ("+" / "-") 4DIGIT )        ; Local differential
44                                                  ;  hours+min. (HHMM)
45 -}
46
47 format :: ZonedTime -> String
48 format zonedTime
49     = let localTime          = zonedTimeToLocalTime zonedTime
50           timeZone           = zonedTimeZone zonedTime
51           (year, month, day) = toGregorian (localDay localTime)
52           (_, _, week)       = toWeekDate  (localDay localTime)
53           timeOfDay          = localTimeOfDay localTime
54       in
55         concat [ shortWeekDayName week
56                , ", "
57                , show2 day
58                , " "
59                , shortMonthName month
60                , " "
61                , show2 (year `mod` 100)
62                , " "
63                , show2 (todHour timeOfDay)
64                , ":"
65                , show2 (todMin timeOfDay)
66                , ":"
67                , show2 (floor (todSec timeOfDay))
68                , " "
69                , show4digitsTZ timeZone
70                ]
71
72 parse :: String -> Maybe ZonedTime
73 parse src = case P.parse p "" src of
74               Right zt -> Just zt
75               Left  _  -> Nothing
76     where
77       p = do zt <- parser
78              _  <- P.eof
79              return zt