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?
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.
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.
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.
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');
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');
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With