[1] [[Cookie]] では [CODE(HTTP)@en[[[Expires]]]] [[属性]]の値として[[日時]]が使われますが、 [CODE@en[[VAR[Wdy]], [VAR[DD]]-[VAR[Mon]]-[VAR[YYYY]] [VAR[HH]]:[VAR[MM]]:[VAR[SS]] GMT]] のような独自の書式で日時を記述します。 * 仕様書 - [14] [[Netscape Cookie]]: [CITE[Client Side State - HTTP Cookies]] * 構文 [15] [[Cookieの日付形式]]は [PRE(HTTP code)[ [VAR[Wdy]], [VAR[DD]]-[VAR[Mon]]-[VAR[YYYY]] [VAR[HH]]:[VAR[MM]]:[VAR[SS]] GMT ]PRE] のように[[日時]]を [[UTC]] で記述します。[SRC[>>14]] [[HTTPの日付形式]]に似ていますが、[[日]]の要素間に [CODE(char)[[[-]]]] を入れなければいけません。 [16] 仕様書 [SRC[>>14]] には > This is based on [[RFC 822]], [[RFC 850]], [[RFC 1036]], and [[RFC 1123]], with the variations that the only legal time zone is [CODE@en[[[GMT]]]] and the separators between the elements of the date must be dashes. などと訳がわからないことが書かれています。当時は [[HTTP]] が [[RFC]] 化されていなかったのでそれを参照していないのは仕方がないにせよ [WEAK[(でも [[Internet Draft]] はあったはず)]]、 なんでこんなおかしな説明の書き方をしたのかは謎です。 [17] 仕様書で示された書式や実際の例示 >>2 の書式は [[RFC 850の日付形式]]に一番近いですが、 >>16 にある通り[[時間帯]]が [CODE(HTTP)@en[[[GMT]]]] に固定されています。 [VAR[Wdy]] とあるといかにも省略形の[[曜日]]が使われそうですが、 >>2 の例示は長い名前になっていて、これは [[RFC 850]] と一致しています。 現実には短い名前の方が一般的な気がします。 [18] [[年号]]は >>15 からすると[[4桁]]でなければならないように見えますが、>>2 の例示は[[2桁]]になっています。 *例 -[5] [CODE[Fri, 24-Jan-2003 16:41:00 GMT]] -[2] [CODE[Wednesday, 09-Nov-99 23:12:40 GMT]] ;; [SRC[>>6]] -[6] [CODE[Mon, 30 Dec 2020 23:59:59 GMT]] ;; 不正: HTTP 形式 -[7] [CODE[Thursday, 31-Dec-2037 00:00:00 JST]] ;; 不正: 長い曜日名, 未定義の時間帯名 * メモ [3] >>2 の例は Netscape の仕様書からの引用ですが、ここでは''4桁でなければならない''と規定されているはずの年号が2桁になっています。 (それに、 >>1 の構文なら曜日は短い名前のはずだと思うのですがね。) [4] 巷の [[CGI]] script などを見ていると、日付の指定が間違っているものも見受けられます。 [8] >>4,>>6-7 当然、不正な形式に対する動作は未定義です。 とはいえ、 >>2 のように仕様からしてぐちゃぐちゃなので、どうしたものでしょうか。 [9] >>8 もちろん、 >>1 の形式を使えば全ての Cookie 対応 UA で問題なく処理されるはずです。 [10] >>8 そういうのを解説してる書籍とか Web page があるらしいです。ひどいな! [11] [CITE['''['''JavaHouse-Brewers:31373''']''' Re: Cookie.setMaxAge() について]] ([TIME[2001-11-24 20:53:20 +09:00]] 版) >> 「問題」 >> ブラウザがInternet Explorer 5の場合、 = Cookie.setMaxAge()へのパラメータが正の場合、 クッキーは設定されるが、指定された秒数が経過しても、 クッキーは無効にならない。 クッキーの有効期間には、、"木, 9 14 30828 02:48:05"が設定されている。 (クッキー受信時の確認ダイアログで確認) ブラウザを再起動しても、クッキーは有効である。 # NN4.7では、指定された時間が経過するとクッキーは無効になる。 >> = Cookie.setMaxAge()へのパラメータに0を指定した場合、 クッキーが設定されたままになる。 ブラウザを再起動しても、クッキーは有効である。 クッキーの有効期間には、"木, 9 14 30828 02:48:05"が設定されている >> ;; NN4.7では、ブラウザはクッキーを受信した旨をダイアログで表示する。 しかし、その後のリクエストではこのクッキーを送信しない。(期待通り) >「原因」 >Internet Explorer 5(version 3, 4では調べていない)では、 次のようにタイムゾーンがJSTで指定されている有効期限付きSet-Cookieヘッダを 正しく解釈できません。 > [PRE(HTTP example bad code)[ Set-Cookie:NAME=VALUE; expires=Tuesday,28-Feb-2000 19:00:00 JST ]PRE] > IE5では、タイムゾーンがGMTである場合は、クッキーの有効期限が正しく設定されます。 (タイムゾーンがその他の場合の動作は、調べていません。) [12] [CITE[教えて!北京五輪「みんなにQ&A」 クッキーの有効期限の記述について]] ([TIME[2009-02-01 21:31:33 +09:00]] 版) >IEでは、曜日は確かに 無視されているようでした(曜日をいろいろ変えても 設定日時には、クッキーが削除されました)。 [13] [CITE['''['''JavaScript + Cookie''']'''実は有効期限指定がすごく簡単だった件について / 文系大学的IT系の悲哀]] ([[LiosK]] 著, [TIME[2009-02-01 21:50:13 +09:00]] 版) >手元にあるIE6, Firefox2, Opera9で確認済み。Date#toUTCStringで有効期限が指定できるなら楽だ。