Подтвердить что ты не робот

Формат даты/времени, используемый в заголовках HTTP

Какой RFC описывает формат, используемый для даты/времени в современных HTTP-заголовках, таких как "Last-Modified" и "If-Modified-Since", и как генерировать строку даты/времени в PHP в соответствии с таким форматом

Некоторые источники указывают на RFC 2822, который, как указано в DateTime, использует формат D, d M Y H:i:s O, но из моих тестов, этот формат создает +0000 вместо GMT в конце. Я пробовал другие спецификаторы часовых поясов, но ни один из них, кажется, не поставил GMT в конец, ближайший результат, который я получил, был с UTC. Однако, как показал Firebug, все сайты используют GMT в заголовках HTTP, а не +0000 или UTC.

Итак, какой формат действительно используется и как мне форматировать дату/время так же, как и другие сайты?

4b9b3361

Ответ 1

Как вы можете видеть здесь, заголовок Last-Modified имеет datetimes в RFC2616 формат.

В разделе 14.29 Last-Modified вы можете видеть, что формат даты должен быть:

"Last-Modified" ":" HTTP-date

Примером его использования является

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

Еще одна цитата из RFC2616 подробнее:

Все метки даты и времени HTTP ДОЛЖНЫ быть представлены в средневзвешенном времени по Гринвичу (GMT) без исключения.

В PHP вы можете использовать формат D, d M Y H:i:s T, если вы используете функцию gmdate(), которая всегда возвращает datetime в GMT offset/timeszone:

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

Если вы хотите использовать расширение DateTime:

$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');

Ответ 2

Хорошо, давайте взглянем на RFC 2616, который определяет HTTP 1.1: http://tools.ietf.org/html/rfc2616#section-3.3

HTTP-приложения исторически допускали три разных формата для представления штампов даты/времени:

 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 asctime() format

Первый формат является предпочтительным в качестве стандарта Интернета и представляет собой подмножество фиксированной длины, определенное RFC 1123 [8] (обновление для RFC 822 [9]).

(...)

Все метки даты и времени HTTP ДОЛЖНЫ быть представлены в средневзвешенном времени по Гринвичу (GMT) без исключения.

So DateTime::COOKIE или Datetime::RFC850 использовать допустимый формат. Предпочтительным в соответствии с RFC будет D, d M Y H:i:s T, который не определен какой-либо константой в классе DateTime.

Чтобы убедиться, что GMT используется, следующий код должен быть достаточным:

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