2014-01-14 4 views
29

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

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

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

+0

Добавить некоторый код ... –

ответ

41

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

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

"Last-Modified" ":" HTTP-date 

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

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

Другая цитата из RFC2616 read more:

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

В PHP вы можете использовать формат D, d M Y H:i:s T, если вы используете функцию gmdate(), которая всегда возвращает DateTime по Гринвичу офсет/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'); 
+0

Но распространенное количество другой строки даты на той странице, на которую вы ссылаетесь, использует формат GMT (7 примеров используют GMT и всего 1 пример +0000). И, например, сайт USA Today отвечает на следующие заголовки: Last-Modified: Tue, 14 января 2014 18:48:38 GMT; Истекает: Вт, 14 Янв. 2014 18:50:58 GMT; Дата: Вт, 14 января 2014 18:50:38 GMT, поэтому все используют GMT. –

+1

GMT - это _Greenwich Mean Time_, это абсолютный. –

+0

@ Glavić Я бы по-прежнему хотел, чтобы GMT как опция. –

10

Ну, давайте посмотрим на 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's asctime() format 

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

(...)

Все HTTP штампы даты/времени должны быть представлены в Greenwich Mean Time (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'); 
+0

Существует константа для предпочтительного формата 'DateTime :: RFC1123' /' DATE_RFC1123'. – user2045006

+1

Это близко, но не то же самое. Он использует 'O' в конце вместо' T', который вернет '+ 0000' вместо' GMT' (в соответствии с требованиями стандарта). – hanzi

Смежные вопросы