Quel RFC décrit le format utilisé pour la date/heure dans les en-têtes HTTP modernes, tels que "Last-Modified" et "If-Modified-Since", et comment générer une chaîne de date/heure dans PHP selon format?
Certaines sources pointent vers la RFC 2822, qui, comme indiqué par DateTime class, utilise le format D, d M Y H:i:s O
, mais ce test produit pour mes tests +0000
au lieu de GMT
à la fin. J'ai essayé d'autres spécificateurs de fuseau horaire, mais aucun d'eux ne semble mettre GMT
à 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 formater la date/l'heure de la même manière que les autres sites?
Comme vous pouvez le voir ici , Last-Modified
, l'en-tête a des dates/heures dans RFC2616 format.
Dans la section 14.29 Last-Modified
vous pouvez voir que le format de 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 RFC2616 Lire la suite :
Tous les horodatages HTTP DOIVENT être représentés en heure GMT (Greenwich Mean Time), sans exception.
Dans PHP, vous pouvez utiliser le format D, d M Y H:i:s T
si vous utilisez la fonction gmdate()
qui renvoie toujours la date/heure dans le décalage horaire GMT/timeszone:
echo gmdate('D, d M Y H:i:s T');
Si vous souhaitez utiliser l'extension 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');
Voyons maintenant la RFC 2616 qui définit HTTP 1.1: http://tools.ietf.org/html/rfc2616#section-3.3
Les applications HTTP ont historiquement autorisé trois formats différents pour la représentation des horodatages:
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 standard Internet et représente un sous-ensemble de longueur fixe de celui défini par la RFC 1123 [8] (mise à jour de la RFC 822 [9]).
(...)
Tous les horodatages HTTP DOIVENT être représentés en heure GMT (Greenwich Mean Time), sans exception.
Donc, DateTime::COOKIE
ou Datetime::RFC850
utilise un format valide. Le préféré selon le RFC serait D, d M Y H:i:s T
qui n'est défini par aucune constante de la classe DateTime
.
Pour vous assurer que GMT est utilisé, le code suivant devrait suffire:
gmdate('D, d M Y H:i:s T');
Je suis à peu près sûr que la réponse (maintenant) correcte ici est rfc7231 - section 7.1.1.1 Elle spécifie les formats de date et d’heure et que la sémantique HTTP-date
est définie.
HTTP-date = IMF-fixdate / obs-date
Nous pouvons aussi voir que
Lorsqu'un expéditeur génère un champ d'en-tête contenant un ou plusieurs les horodatages définis comme HTTP-date, l'expéditeur DOIT générer ces horodatages au format IMF-fixdate.
Donc, pour un serveur envoyant un "en-tête HTTP de l'heure moderne" - où la valeur est un HTTP-date
, le format est équivalent au format IMF-fixdate
.
Donc, pour répondre à la question réelle.
Quel RFC décrit le format utilisé pour la date/heure à l’heure moderne En-têtes HTTP
Vous devez connaître la définition de IMF-fixdate
- qui se trouve dans rfc7231 . Elle donne également la définition de obs-date
aussi i.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