]> gitweb @ CieloNegro.org - time-http.git/blob - Data/Time/RFC822.hs
HTTP
[time-http.git] / Data / Time / RFC822.hs
1 module Data.Time.RFC822
2     ( format
3     , parse
4
5     -- private
6     , showRFC822TimeZone
7     )
8     where
9
10 import qualified Text.Parsec as P
11
12 import Data.Time
13 import Data.Time.Calendar.WeekDate
14 import Data.Time.HTTP.Common
15 import Data.Time.RFC822.Parsec
16
17
18 {-
19      date-time   =  [ day "," ] date time        ; dd mm yy
20                                                  ;  hh:mm:ss zzz
21
22      day         =  "Mon"  / "Tue" /  "Wed"  / "Thu"
23                  /  "Fri"  / "Sat" /  "Sun"
24
25      date        =  1*2DIGIT month 2DIGIT        ; day month year
26                                                  ;  e.g. 20 Jun 82
27
28      month       =  "Jan"  /  "Feb" /  "Mar"  /  "Apr"
29                  /  "May"  /  "Jun" /  "Jul"  /  "Aug"
30                  /  "Sep"  /  "Oct" /  "Nov"  /  "Dec"
31
32      time        =  hour zone                    ; ANSI and Military
33
34      hour        =  2DIGIT ":" 2DIGIT [":" 2DIGIT]
35                                                  ; 00:00:00 - 23:59:59
36
37      zone        =  "UT"  / "GMT"                ; Universal Time
38                                                  ; North American : UT
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;
44                                                  ;  A:-1; (J not used)
45                                                  ;  M:-12; N:+1; Y:+12
46                  / ( ("+" / "-") 4DIGIT )        ; Local differential
47                                                  ;  hours+min. (HHMM)
48 -}
49
50 format :: ZonedTime -> String
51 format zonedTime
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
57       in
58         concat [ shortWeekDayName week
59                , ", "
60                , show2 day
61                , " "
62                , shortMonthName month
63                , " "
64                , show2 (year `mod` 100)
65                , " "
66                , show2 (todHour timeOfDay)
67                , ":"
68                , show2 (todMin timeOfDay)
69                , ":"
70                , show2 (floor (todSec timeOfDay))
71                , " "
72                , showRFC822TimeZone timeZone
73                ]
74
75 showRFC822TimeZone :: TimeZone -> String
76 showRFC822TimeZone tz
77     | timeZoneMinutes tz == 0 = "GMT"
78     | otherwise               = show4digitsTZ tz
79
80 parse :: String -> Maybe ZonedTime
81 parse src = case P.parse p "" src of
82               Right zt -> Just zt
83               Left  _  -> Nothing
84     where
85       p = do zt <- rfc822DateAndTime
86              _  <- P.eof
87              return zt