Le format date / Heure utilisé dans les en-têtes HTTP

quel RFC décrit le format utilisé pour la date / heure dans les en-têtes HTTP modernes, comme "Last-Modified" et "If-Modified-Since", et comment générer une chaîne date/heure en PHP selon un tel format?

certaines sources pointent vers RFC 2822, qui, comme indiqué par DateTime class, utilise D, d M Y H:i:s O format, mais de mes tests, ce format produit +0000 au lieu de GMT à la fin. J'ai essayé d'autres fuseau horaire prescripteurs, mais aucun d'eux ne semble mettre GMT a la fin, le résultat le plus proche que j'ai obtenu était avec UTC. Cependant, comme L'a montré Firebug, tous les sites utilisent GMT dans les en-têtes HTTP et non +0000 ou UTC.

alors quel format est réellement utilisé et comment dois-je formater la date/heure de la même manière que le font les autres sites?

38
demandé sur Desmond Hume 2014-01-14 22:13:30

3 réponses

Comme vous pouvez le voir ici,Last-Modified l'en-tête a des datetimes en RFC2616 format.

dans la section 14.29 Last-Modified vous pouvez voir que le format de la date doit être:

"Last-Modified" ":" HTTP-date

Un exemple de son utilisation est

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

une Autre citation de la RFC2616 lire la suite:

toutes les dates/heures HTTP doivent être représentées dans la moyenne de Greenwich Heure (GMT), sans exception.

en PHP vous pouvez utiliser le format D, d M Y H:i:s T si vous utilisez la fonction gmdate() qui renvoie toujours datetime en décalage GMT/timeszone:

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

Si vous souhaitez utiliser DateTime poste:

$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');
49
répondu Glavić 2014-01-14 22:00:40

bon, regardons la RFC 2616 qui définit HTTP 1.1: http://tools.ietf.org/html/rfc2616#section-3.3

les applications HTTP ont historiquement permis trois formats différents pour la représentation des timbres de date/heure:

 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

le premier format est préféré comme norme Internet et représente un sous-ensemble de longueur fixe de celui défini par la RFC 1123 [8] (une mise à jour de la RFC 822 [9]).

(...)

toutes les dates/heures HTTP doivent être représentées en heure de Greenwich (GMT), sans exception.

DateTime::COOKIE ou Datetime::RFC850 utilisez un format valide. Selon le RFC, le meilleur serait D, d M Y H:i:s T qui n'est défini par aucune constante dans le DateTime classe.

pour s'assurer que GMT est utilisé, le code suivant devrait suffire:

gmdate('D, d M Y H:i:s T');
13
répondu hanzi 2014-01-14 18:33:58

je suis assez sûr que la (maintenant) bonne réponse ici est rfc7231-section 7.1.1.1 il spécifie les Formats Date/heure et est où le HTTP-date la sémantique est définie.

HTTP-date    = IMF-fixdate / obs-date

on le voit aussi

Lorsqu'un expéditeur génère un champ d'en-tête qui contient un ou plusieurs horodatage défini comme HTTP-date, l'expéditeur générer de ceux horodatage dans le le FMI fixdate format.

donc pour un serveur qui envoie un "en-tête HTTP du temps moderne"- dont la valeur est un HTTP-date le format est équivalent à IMF-fixdate format.

Donc pour répondre à la question.

quel RFC décrit le format utilisé pour la date / heure dans les temps modernes Headers HTTP

vous devez connaître la définition de IMF-fixdate - qui est dans rfc7231. Il est également donner la définition de obs-date trop je.e 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
0
répondu Fraser 2018-04-10 23:08:15