it-swarm.com.de

Das Datums-/Uhrzeitformat, das in HTTP-Headern verwendet wird

Welches RFC beschreibt das Format für Datum/Uhrzeit in modernen HTTP-Headern, wie "Last-Modified" und "If-Modified-Since", und wie eine Datums-/Uhrzeit-Zeichenfolge in PHP entsprechend generiert wird Format?

Einige Quellen verweisen auf RFC 2822, das, wie von DateTime class angegeben, das D, d M Y H:i:s O-Format verwendet, aber bei meinen Tests erzeugt dieses Format +0000 anstelle von GMT am Ende. Ich habe andere Zeitzonen-Spezifizierer ausprobiert, aber keiner von ihnen scheint GMT am Ende zu setzen. Das nächste Ergebnis war UTC. Wie Firebug gezeigt hat, verwenden jedoch alle Sites GMT in HTTP-Headern und nicht +0000 oder UTC.

Welches Format wird also wirklich verwendet und wie formatiere ich Datum/Uhrzeit genauso wie andere Websites?

39
Desmond Hume

Wie Sie sehen, hier , hat der Last-Modified-Header Datenzeiten im RFC2616 Format.

Im Abschnitt 14.29 Last-Modified sehen Sie, dass das Datumsformat Folgendes sein sollte:

"Last-Modified" ":" HTTP-date

Ein Beispiel für seine Verwendung ist

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

Ein weiteres Zitat aus RFC2616 Weiterlesen :

Alle HTTP-Datums-/Zeitstempel MÜSSEN ausnahmslos in Greenwich Mean Time (GMT) dargestellt werden.

In PHP können Sie das Format D, d M Y H:i:s T verwenden, wenn Sie die Funktion gmdate() verwenden, die datetime immer in GMT offset/timeszone zurückgibt:

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

Wenn Sie die Erweiterung DateTime verwenden möchten:

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

Nun, schauen wir uns RFC 2616 an, der HTTP 1.1 definiert: http://tools.ietf.org/html/rfc2616#section-3.3

HTTP-Anwendungen haben in der Vergangenheit drei verschiedene Formate für die Darstellung von Datums-/Zeitstempeln zugelassen:

 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

Das erste Format wird als Internet-Standard bevorzugt und stellt eine Untermenge fester Länge des durch RFC 1123 [8] definierten Standards dar (ein Update auf RFC 822 [9]).

(...)

Alle HTTP-Datums-/Zeitstempel MÜSSEN ausnahmslos in Greenwich Mean Time (GMT) dargestellt werden.

Daher verwenden DateTime::COOKIE oder Datetime::RFC850 ein gültiges Format. Gemäß dem RFC wäre der bevorzugte Code D, d M Y H:i:s T, der durch keine Konstante in der DateTime-Klasse definiert ist.

Um sicherzustellen, dass GMT verwendet wird, sollte der folgende Code ausreichen:

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

Ich bin mir ziemlich sicher, dass die (jetzt) ​​richtige Antwort hier ist rfc7231 - Abschnitt 7.1.1.1 / Es gibt Datums-/Zeitformate an und gibt die Semantik HTTP-date an.

HTTP-date    = IMF-fixdate / obs-date

Das können wir auch sehen

Wenn ein Absender ein Headerfeld generiert, das ein oder mehrere .__ enthält. Zeitstempel, definiert als HTTP-Datum, muss der Absender diese generieren Zeitstempel im Format IMF-fixdate.

Für einen Server, der einen "modernen HTTP-Header" sendet - wenn der Wert ein HTTP-date ist, entspricht das Format dem IMF-fixdate-Format.

Um die eigentliche Frage zu beantworten. 

Welcher RFC beschreibt das Format für Datum/Uhrzeit in der modernen Zeit HTTP-Header

Sie müssen die Definition von IMF-fixdate kennen, die in rfc7231 ..__ enthalten ist, und auch die Definition von obs-date angeben, d. H. rfc850-date/asctime-date.

     IMF-fixdate  = day-name "," SP date1 SP time-of-day SP GMT
     ; fixed length/zone/capitalization subset of the format
     ; see Section 3.3 of [RFC5322]

     day-name     = %x4D.6F.6E ; "Mon", case-sensitive
                  / %x54.75.65 ; "Tue", case-sensitive
                  / %x57.65.64 ; "Wed", case-sensitive
                  / %x54.68.75 ; "Thu", case-sensitive
                  / %x46.72.69 ; "Fri", case-sensitive
                  / %x53.61.74 ; "Sat", case-sensitive
                  / %x53.75.6E ; "Sun", case-sensitive


     date1        = day SP month SP year
                  ; e.g., 02 Jun 1982

     day          = 2DIGIT
     month        = %x4A.61.6E ; "Jan", case-sensitive
                  / %x46.65.62 ; "Feb", case-sensitive
                  / %x4D.61.72 ; "Mar", case-sensitive
                  / %x41.70.72 ; "Apr", case-sensitive
                  / %x4D.61.79 ; "May", case-sensitive
                  / %x4A.75.6E ; "Jun", case-sensitive
                  / %x4A.75.6C ; "Jul", case-sensitive
                  / %x41.75.67 ; "Aug", case-sensitive
                  / %x53.65.70 ; "Sep", case-sensitive
                  / %x4F.63.74 ; "Oct", case-sensitive
                  / %x4E.6F.76 ; "Nov", case-sensitive
                  / %x44.65.63 ; "Dec", case-sensitive
     year         = 4DIGIT

     GMT          = %x47.4D.54 ; "GMT", case-sensitive

     time-of-day  = hour ":" minute ":" second
                  ; 00:00:00 - 23:59:60 (leap second)

     hour         = 2DIGIT
     minute       = 2DIGIT
     second       = 2DIGIT

   Obsolete formats:

     obs-date     = rfc850-date / asctime-date

     rfc850-date  = day-name-l "," SP date2 SP time-of-day SP GMT
     date2        = day "-" month "-" 2DIGIT
                  ; e.g., 02-Jun-82

     day-name-l   = %x4D.6F.6E.64.61.79    ; "Monday", case-sensitive
            / %x54.75.65.73.64.61.79       ; "Tuesday", case-sensitive
            / %x57.65.64.6E.65.73.64.61.79 ; "Wednesday", case-sensitive
            / %x54.68.75.72.73.64.61.79    ; "Thursday", case-sensitive
            / %x46.72.69.64.61.79          ; "Friday", case-sensitive
            / %x53.61.74.75.72.64.61.79    ; "Saturday", case-sensitive
            / %x53.75.6E.64.61.79          ; "Sunday", case-sensitive


     asctime-date = day-name SP date3 SP time-of-day SP year
     date3        = month SP ( 2DIGIT / ( SP 1DIGIT ))
                  ; e.g., Jun  2
1
Fraser