[3] [[HTTP]] は、二種類の日付・時刻表現形式を定義しています。 一つは、絶対時刻表現 ([CODE(ABNF)[HTTP-Date]]) で、 更に細かく3つの形式に分けることができます。 もう一つは相対時刻表現 ([RUBY[Δ][デルタ]]秒) です。 [[#comment]] * 絶対時刻表現 [13] HTTP に限らず、様々なプロトコルや応用で、 日付と時刻を表現するために色々な方法が考えられてきました。 そのような状況下で HTTP は仕様が策定されたり実装されたりしてきたために、 それぞれが自分の好きな書式 (あるいは実装が楽な書式) を採用していました。 HTTP RFC では、もっとも良く使われていた3つの書式 ([Q[RFC 822 (RFC 1123 で改訂) 形式]], [Q[RFC 850 形式]], [Q[asctime 形式]]) が公式に認められ、特に 822 の形式を推奨しています。 しかし、それ以外の書式にもできるだけ対応することもすすめています。 [4] HTTP が日付に認めている形式のうち、 [Q[[[RFC 822]] ([[RFC 1123]] で改訂) 形式]]は、 RFC 822 + 1123 で定義されている形式の部分集合で、 RFC 822 が認めていた要素間の [CODE(ABNF)[[[linear-white-space]]]] を必要な部分のみ [CODE(ABNF)[[[SP]]]] と厳格にし、 数字の桁数を揃え、[[時間帯]]については [CODE(822)[[[GMT]]]] のみ認めるとしています。 [12] [Q[[[RFC 850]] 形式]]とされているものは、 RFC 850 によると [[ARPANET]] の日付形式であり、 [WEAK[(RFC 850 の他の部分から推察すると)]] [[RFC 822の日付形式]]ではないかと思えますが、よく見ると RFC 822 の形式とはやや異なり、その前の版である [[RFC 733の日付形式]]に一致することが分かります。 ただし、 [[RFC 733]] は年号を4桁でも良いとしていますが、 HTTP の [Q[RFC 850 形式]]は2桁しか認めておらず、 この点で矛盾しています。 [5] [[RFC 2069]] 『An Extension to HTTP : Digest Access Authentication』 は、 2069 の定義する認証関係のプロトコル要素内では [[RFC 1123]] 形式のみを認めています。 [6] Netscape の原 [CODE(HTTP)[[[Cookie]]]] 提案では [CODE(HTTP)[[[expires]]]] 属性で使われる日付形式を [Q[RFC 850 形式]]としています。 ([[RFC 2109]] 参照。) 現実にはいろいろ問題があります。 詳しくは [CODE(WikiPage)[[[Cookieの日付形式]]]]を参照してください。 [7] [[RFC 2518]] ([[WebDAV]]) では上記の [CODE(ABNF)[HTTP-Date]] と [[ISO 8601の日付形式]]を使い分けています。 [1] 古い HTTP/1.0 サーバーの形式(の1つ): [SAMP[Tue Nov 23 16:00:43 1993 GMT]] [2] >>1 [[C]] の関数で返される形式ですかな。 ** 実装 [14] [[Apache]] は [[CGIスクリプト]]の出力する日付の形式を (少なくても [CODE(HTTP)@en[[[Last-Modified:]]]] [[欄]]についてはチェックし、正しければその日付を、正しくなければ [[Unix epoch]] の日付を [[RFC 1123]] 形式で出力します。この時、[[曜日]]が間違っていれば正しい値に直してくれます。 *仕様書から **RFC 1945 (HTTP/1.0); RFC 2068・2616 (HTTP/1.1) 3.3 Date/Time Formats [INS[ ***RFC 2068・2616 3.3.1 Full Date ]INS] >HTTP[DEL[/1.0 [INS[{1945}]]]] applications have historically allowed three different formats for the representation of date/time stamps: HTTP 応用は歴史的に日時を表す3つの書式を認めています。 > - [SAMP(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 - [SAMP(HTTP)[Sun Nov 6 08:49:37 1994]] ; ANSI C's asctime() format > The first format is preferred as an Internet standard and represents a fixed-length subset of that defined by RFC 1123 (an update to RFC 822). The second format is in common use, but is based on the obsolete RFC 850 date format and lacks a four-digit year. [DEL[[INS[{1945}]] HTTP/1.0]] [INS[[INS[{2068,2616}]] HTTP/1.1]] clients and servers that parse the date value [DEL[[INS[{1945}]] should]] [INS[[INS[{2068,2616}]] MUST]] accept all three formats [INS[[INS[{2068,2616}]] (for compatibility with HTTP/1.0)]], though they [DEL[[INS[{1945}]] must never generate the third (asctime) format]] [INS[[INS[{2068,2616}]] MUST only generate the RFC 1123 format for representing HTTP-date values in header fields]]. 最初の書式は Internet 標準で好ましいものであり、 RFC 1123 (RFC 822 の更新) で定義されるものの固定長部分集合です。 2番目の書式は広く使われていますが、廃止されている RFC 850 日付形式 で4桁の年号を表せません。 日付値を解析する HTTP クライアント及び鯖は、 [INS[(HTTP/1.0 との互換性のため、)]] これら3つ全ての日付形式を受け付け[DEL[るべきです]][INS['''なければなりません''']]が、[DEL[3つ目の asctime 形式は生成してはなりません]][INS[頭欄内の [CODE(ABNF)[HTTP-date]] の値表現としては RFC 1123 形式のみを生成し'''なければなりません''']]。 > Note: Recipients of date values are encouraged to be robust in accepting date values that may have been generated by non-HTTP applications, as is sometimes the case when retrieving or posting messages via proxies/gateways to SMTP or NNTP. 註: 日付値の受信者は非 HTTP 応用が生成したであろう日付値も 受け入れられるように柔軟であることを推奨します。記事を SMTP や NNTP のプロキシや関門から記事を受け取ったり 投稿したりすることもあるからです。 > All HTTP[DEL[/1.0 [INS[{1945}]]]] date/time stamps [DEL[[INS[{1945}]] must]] [INS[[INS[{2068,2616}]] MUST]] be represented in [DEL[[INS[{1945}]] Universal Time (UT), also known as]] Greenwich Mean Time (GMT), without exception. [INS[[INS[{2616}]] For the purposes of HTTP, GMT is exactly equal to UTC (Coordinated Universal Time).]] This is indicated in the first two formats by the inclusion of "GMT" as the three-letter abbreviation for time zone, and [DEL[[INS[{1945}]] should]] [INS[[INS[{2068,2616}]] MUST]] be assumed when reading the asctime format. [INS[[INS[{2616}]] HTTP-date is case sensitive and MUST NOT include additional LWS beyond that specifically included as SP in the grammar.]] 全ての HTTP 日時印は例外無くグリニッジ標準時 (GMT) で表されてい[DEL[る必要があります]][INS['''なければなりません''']]。 [INS[HTTP の範囲では、 GMT は UTC (協定世界時) と同じ物です。]] これは「GMT」を時間帯の3文字略称として含めている最初の2つの書式 についてであり、 asctime 形式を読む時はそう仮定[DEL[すべきです]][INS['''しなければなりません''']]。[INS[[CODE(ABNF)[HTTP-date]] では大文字・小文字の区別は無く、文法で [CODE(ABNF)[SP]] が入ると示した場所以外で [CODE(ABNF)[LWS]] を含めては'''なりません'''。]] > [PRE(ABNF code)[ HTTP-date = rfc1123-date | rfc850-date | asctime-date rfc1123-date = wkday "," SP date1 SP time SP "GMT" rfc850-date = weekday "," SP date2 SP time SP "GMT" asctime-date = wkday SP date3 SP time SP 4DIGIT date1 = 2DIGIT SP month SP 4DIGIT ; day month year (e.g., 02 Jun 1982) date2 = 2DIGIT "-" month "-" 2DIGIT ; day-month-year (e.g., 02-Jun-82) date3 = month SP ( 2DIGIT | ( SP 1DIGIT )) ; month day (e.g., Jun 2) time = 2DIGIT ":" 2DIGIT ":" 2DIGIT ; 00:00:00 - 23:59:59 wkday = "Mon" | "Tue" | "Wed" | "Thu" | "Fri" | "Sat" | "Sun" weekday = "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday" | "Saturday" | "Sunday" month = "Jan" | "Feb" | "Mar" | "Apr" | "May" | "Jun" | "Jul" | "Aug" | "Sep" | "Oct" | "Nov" | "Dec" ]PRE] > Note: HTTP requirements for the date/time stamp format apply only to their usage within the protocol stream. Clients and servers are not required to use these formats for user presentation, request logging, etc. 註: HTTP は日時印形式をプロトコル列中での使用についてのみ 要求しています。クライアント及びサーバーは利用者への上演や 要求の記録などでこれらの形式を使う必要はありません。 [INS[ ***RFC 2068・2616 (HTTP/1.1) 3.3.2 Delta Seconds > Some HTTP header fields allow a time value to be specified as an integer number of seconds, represented in decimal, after the time that the message was received. 幾つかの HTTP 頭欄では、時刻値を、 メッセージを受信した時刻からの十進数で表現した整数値として指定することを認めています。 > - delta-seconds = 1*DIGIT ]INS] **RFC 1945 (HTTP/1.0) C.2; RFC 2068 (HTTP/1.1) 19.4.2; RFC 2616 (HTTP/1.1) 19.4.3 Conversion of Date Formats > [DEL[HTTP/1.0]] [INS[HTTP/1.1]] uses a restricted set of date formats (Section 3.3[INS[.1]]) to simplify the process of date comparison. Proxies and gateways from other protocols [DEL[should]] [INS[SHOULD]] ensure that any Date header field present in a message conforms to one of the [DEL[HTTP/1.0]] [INS[HTTP/1.1]] formats and rewrite the date if necessary. [11] HTTP/1.1 は[[日付形式]]の制限された集合を日付比較処理の簡素化のために使っています。 他のプロトコルからの串や関門はメッセージ中の Date 頭欄を HTTP/1.1 形式のどれかに適合することを確認し、必要があれば日付を書き換える'''のが良い'''。 [INS[ 注意: 修正点は RFC 1945 → RFC 2068 もの。 ]INS] ** RFC の部分の License See [[RFCのライセンス]] * 実装 [15] [[Perlモジュール]] [CODE(perl)[[[HTTP::Date]]]] には、 [[asctime]] 形式の時刻を、動作中の計算機の[[現地時間]]で表されるものとして処理する不具合あるいは仕様があります。