web-dev-qa-db-ja.com

HTTPヘッダーで使用される日付/時刻形式

「最終変更」や「If-Modified-Since」など、現代のHTTPヘッダーの日付/時刻に使用される形式、およびPHPで日付/時刻文字列を生成する方法を説明しているRFCそのような形式に?

DateTime classで示されるように、D, d M Y H:i:s O形式を使用しているRFC 2822を指すソースもありますが、私のテストでは、この形式は最後にGMTではなく+0000を生成します。私は他のタイムゾーン指定子を試しましたが、それらのどれも最後にGMTを付けていないようです。私が得た最も近い結果はUTCでした。ただし、Firebugが示したように、すべてのサイトは+0000GMTではなく、HTTPヘッダーでUTCを使用しています。

では、どのフォーマットが実際に使用され、他のサイトと同じように日付/時刻をフォーマットするのですか?

43
Desmond Hume

ご覧のとおり here_Last-Modified_ヘッダーの日付時刻は RFC2616 formatです。

セクション _14.29 Last-Modified_ で、日付形式は次のようになっていることがわかります。

_"Last-Modified" ":" HTTP-date
_

その使用例は次のとおりです。

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

RFC2616からの別の引用 続きを読む :

すべてのHTTP日付/時刻スタンプは、例外なくグリニッジ標準時(GMT)で表現する必要があります。

PHPでは、GMTオフセット/タイムゾーンで常に日時を返す関数gmdate()を使用する場合、フォーマット_D, d M Y H:i:s T_を使用できます。

_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');
_
54
Glavić

さて、HTTP 1.1を定義するRFC 2616を見てみましょう: http://tools.ietf.org/html/rfc2616#section-3.

HTTPアプリケーションは、これまで、日付/時刻スタンプの表現に3つの異なる形式を許可してきました。

 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日付/時刻スタンプは、例外なくグリニッジ標準時(GMT)で表現する必要があります。

そう DateTime::COOKIEまたはDatetime::RFC850有効な形式を使用します。 RFCによると、D, d M Y H:i:s Tこれは、DateTimeクラスの定数によって定義されていません。

GMTが使用されていることを確認するには、次のコードで十分です。

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

ここでの(現在の)正解は rfc7231-セクション7.1.1.1 です。これは日付/時刻形式を指定し、HTTP-dateセマンティクスが定義されている場所です。

HTTP-date    = IMF-fixdate / obs-date

また、私たちはそれを見ることができます

送信者がHTTP-dateとして定義された1つ以上のタイムスタンプを含むヘッダーフィールドを生成すると、送信者[〜 #〜] must [〜#〜]IMF-fixdate形式でタイムスタンプを生成します。

したがって、「現代のHTTPヘッダー」を送信するサーバーの場合、値がHTTP-dateである場合、形式はIMF-fixdate形式と同等です。

実際の質問に答えるために。

どのRFCが現代のHTTPヘッダーの日付/時刻に使用される形式を記述しているか

Rfc7231にあるIMF-fixdateの定義を知る必要があります。また、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
1
Fraser