HTTP标头中使用的日期/时间格式

时间:2014-01-14 18:13:31

标签: php http date rfc

哪个RFC描述现代HTTP标头中用于日期/时间的格式,如“Last-Modified”和“If-Modified-Since”,以及如何根据这种格式在PHP中生成日期/时间字符串?

某些来源指向RFC 2822,正如DateTime类所示,它使用D, d M Y H:i:s O格式,但是从我的测试中,此格式产生+0000而不是{{1} } 在末尾。我尝试了其他时区说明符,但似乎没有一个将GMT放在最后,我得到的最接近的结果是GMT。但是,正如Firebug所示,所有网站都在HTTP标头中使用UTC,而不是GMT+0000

那么实际使用的是什么格式?如何以与其他网站相同的方式格式化日期/时间?

4 个答案:

答案 0 :(得分:51)

正如您所看到的here Last-Modified标题的日期时间为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(),函数echo gmdate('D, d M Y H:i:s T'); 始终以GMT偏移/时区返回日期时间:

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'); 分机:

{{1}}

答案 1 :(得分:13)

好吧,让我们看一下定义HTTP 1.1的RFC 2616: 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
     

第一种格式首选作为Internet标准,代表RFC 1123 [8](RFC 822 [9]的更新)定义的固定长度子集。

     

(...)

     

所有HTTP日期/时间戳必须以格林威治标准时间(GMT)表示,无一例外。

因此DateTime::COOKIEDatetime::RFC850使用有效格式。根据RFC的首选项是D, d M Y H:i:s T,它不是由DateTime类中的任何常量定义的。

为确保使用GMT,以下代码应该足够:

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

答案 2 :(得分:1)

我很确定这里的(现在)正确答案是rfc7231 - section 7.1.1.1它指定了日期/时间格式,并且是定义HTTP-date语义的地方。

HTTP-date    = IMF-fixdate / obs-date

我们也可以看到

  

当发件人生成包含一个或多个的标头字段时   时间戳定义为 HTTP-date ,发件人必须生成那些   时间戳采用 IMF-fixdate 格式。

因此,对于发送“现代HTTP标头”的服务器 - 其值为HTTP-date,格式等同于IMF-fixdate格式。

所以回答实际问题。

  

哪个RFC描述了现代日期/时间使用的格式   HTTP标头

您需要知道IMF-fixdate的定义 - 它位于rfc7231中。 它也给出了obs-date的定义,即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

答案 3 :(得分:-2)

通过Carbon:

Carbon::now()->setTimezone('GMT')->format("D, d M Y H:i:s T")