time-http-0.1: Parse and format HTTP/1.1 Date and Time string

Data.Time.HTTP

Description

This module provides functions to parse and format HTTP/1.1 date and time formats.

The HTTP/1.1 specification (RFC 2616) says that HTTP/1.1 clients and servers which parse the date value MUST accept all the following formats, though they MUST only generate the RFC 1123 format for representing HTTP-date values in header fields:

 Sun, 06 Nov 1994 08:49:37 GMT  ; RFC 822, updated by RFC 1123
 Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
 Sun Nov  6 08:49:37 1994       ; ANSI C's asctime() format

It also says that all HTTP date/time stamps MUST be represented in Greenwich Mean Time (GMT), without exception. For the purposes of HTTP, GMT is exactly equal to UTC (Coordinated Universal Time). This is indicated in the first two formats by the inclusion of "GMT" as the three-letter abbreviation for time zone, and MUST be assumed when reading the asctime format.

 HTTP-date    = rfc1123-date | rfc850-date | asctime-date
 rfc1123-date = wkday "," SP date1 SP time SP "GMT"
 rfc850-date  = weekday "," SP date2 SP time SP "GMT"
 asctime-date = wkday SP date3 SP time SP 4DIGIT
 date1        = 2DIGIT SP month SP 4DIGIT
                ; day month year (e.g., 02 Jun 1982)
 date2        = 2DIGIT "-" month "-" 2DIGIT
                ; day-month-year (e.g., 02-Jun-82)
 date3        = month SP ( 2DIGIT | ( SP 1DIGIT ))
                ; month day (e.g., Jun  2)
 time         = 2DIGIT ":" 2DIGIT ":" 2DIGIT
                ; 00:00:00 - 23:59:59
 wkday        = "Mon" | "Tue" | "Wed"
              | "Thu" | "Fri" | "Sat" | "Sun"
 weekday      = "Monday" | "Tuesday" | "Wednesday"
              | "Thursday" | "Friday" | "Saturday" | "Sunday"
 month        = "Jan" | "Feb" | "Mar" | "Apr"
              | "May" | "Jun" | "Jul" | "Aug"
              | "Sep" | "Oct" | "Nov" | "Dec"

Synopsis

Documentation

format :: UTCTime -> StringSource

Format an UTCTime in RFC 1123 date and time.

parse :: String -> Maybe UTCTimeSource

Parse a date and time string in any of RFC 822, RFC 1123, RFC 850 and ANSI C's asctime() formats. When the string can't be parsed, it returns Nothing.

This function is even more permissive than what HTTP/1.1 specifies. That is, it accepts 2-digit years in RFC 822, omitted separator symbols in RFC 850, omitted sec fields, and non-GMT time zones. I believe this behavior will not cause a problem but you should know this.