Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The date/time format used in HTTP headers

Tags:

date

http

php

rfc

Which RFC describes the format used for date/time in the modern time HTTP headers, like "Last-Modified" and "If-Modified-Since", and how to generate a date/time string in PHP according to such format?

Some sources point to RFC 2822, which, as indicated by DateTime class, is using D, d M Y H:i:s O format, but from my tests, this format produces +0000 instead of GMT at the end. I tried other timezone specifiers but none of them seems to put GMT at the end, the closest result I got was with UTC. However, as was shown by Firebug, all sites are using GMT in HTTP headers and not +0000 or UTC.

So what format is really used and how do I format date/time in the same way as other sites do?

like image 229
Desmond Hume Avatar asked Jan 14 '14 18:01

Desmond Hume


People also ask

What is the date header in HTTP?

The Date property represents the value of a Date HTTP header on an HTTP response. The Date header is the date and time the message was sent. Javascript and . NET languages do not use the DateTime object directly.

What is HTTP date format?

2 digit minute number, e.g. "04" or "59". 2 digit second number, e.g. "04" or "59". Greenwich Mean Time. HTTP dates are always expressed in GMT, never in local time.

Is HTTP date header required?

An origin server MUST NOT send a Date header field if it does not have a clock capable of providing a reasonable approximation of the current instance in Coordinated Universal Time. An origin server MAY send a Date header field if the response is in the 1xx (Informational) or 5xx (Server Error) class of status codes.


2 Answers

As you can see here, Last-Modified header has datetimes in RFC2616 format.

In section 14.29 Last-Modified you can see that date format should be:

"Last-Modified" ":" HTTP-date 

An example of its use is

Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT 

Another quote from RFC2616 read more :

All HTTP date/time stamps MUST be represented in Greenwich Mean Time (GMT), without exception.

In PHP you can use format D, d M Y H:i:s T if you use function gmdate() which always returns datetime in GMT offset/timeszone:

echo gmdate('D, d M Y H:i:s T'); 

If you wish to use DateTime extension:

$dt = new DateTime('UTC'); #$dt = new DateTime('2013-01-01 12:00:00', new DateTimezone('UTC')); echo $dt->format('D, d M Y H:i:s \G\M\T'); 
like image 196
Glavić Avatar answered Sep 24 '22 20:09

Glavić


Well, let's have a look at RFC 2616 which defines HTTP 1.1: https://www.rfc-editor.org/rfc/rfc2616#section-3.3

HTTP applications have historically allowed three different formats for the representation of date/time stamps:

 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 

The first format is preferred as an Internet standard and represents a fixed-length subset of that defined by RFC 1123 [8] (an update to RFC 822 [9]).

(...)

All HTTP date/time stamps MUST be represented in Greenwich Mean Time (GMT), without exception.

So DateTime::COOKIE or Datetime::RFC850 use a valid format. The preferred one according to the RFC would be D, d M Y H:i:s T which is not defined by any constant in the DateTime class.

To make sure that GMT is used, the following code should suffice:

gmdate('D, d M Y H:i:s T'); 
like image 33
hanzi Avatar answered Sep 25 '22 20:09

hanzi