Date.toString()の実装依存を調査

Date.toString()が何を返すか調べてみました。
If-Modified-Since ヘッダの値に、toString()をそのまま渡せちゃったりしないかな? を調べるのが目的です。

3種類の日付フォーマット

8年ほど前に、Webサーバやらメールサーバを仕事で実装しまくっていたときにRFCを読みあさってたんですが、今一度調べてみました。
HTTP1.1のRFCによると、三種類の日付フォーマットを受けとめてくれます。

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

SMTPRFCから引き継いだものやら何やらで、3つもあるんだっけか。

Date.toString()

次に、各ブラウザ上で動作するJavaScriptが何を返すか調べてみました。

ブラウザ (new Date(0)).toString()
Firefox2 Thu Jan 01 1970 09:00:00 GMT+0900 asctime()
Firefox3 Thu Jan 01 1970 09:00:00 GMT+0900 asctime()
IE6 Thu Jan 1 09:00:00 UTC+0900 1970 独自路線
IE8 Thu Jan 1 09:00:00 UTC+0900 1970 独自路線
Safari3.1 Thu Jan 01 1970 09:00:00 GMT+0900 (モフビ (ユWマタボ))
Opera9.25 Thu, 01 Jan 1970 09:00:00 GMT+0900 RFC1123準拠
Opera9.5β2 Thu, 01 Jan 1970 09:00:00 GMT+0900 RFC1123準拠

Safariの深淵に触れる余裕は無いのでこの場はスルーしますが、3が付くとアホになるのは、流行ってるみたいだから仕方ないのかね。

Date.toUTCString()

次に、toUTCString()を試してみます。

ブラウザ (new Date(0)).toUTCString()
Firefox2 Thu, 01 Jan 1970 00:00:00 GMT RFC1123準拠
Firefox3 Thu, 01 Jan 1970 00:00:00 GMT RFC1123準拠
IE6 Thu, 1 Jan 1970 00:00:00 UTC 独自路線
IE8 Thu, 1 Jan 1970 00:00:00 UTC 独自路線
Safari3.1 Thu, 01 Jan 1970 00:00:00 GMT RFC1123準拠
Opera9.25 Thu, 01 Jan 1970 00:00:00 GMT RFC1123準拠
Opera9.5β2 Thu, 01 Jan 1970 00:00:00 GMT RFC1123準拠

うん、toUTCString() がいい感じです。

反省会

  • IE対策のためにどんどんライブラリがメタボ化してくなぁ…
    • IEが居なくなれば、どんだけコストが減るんだか。
      • とりあえず、toUTCString()の文字列長が29なら、6文字目に0をぶち込んで、あとはUTCGMTに置換してしまえば良さげだ。
  • Safariのバグっぽい動作は報告すべきなんだろうか?
    • バグレポートは、既知のバグかどうかぐらいは調べてからにしよう。
  • 使えそうだから使う(実装依存)といえばそうなんだけどね。
    • Ajaxのリクエストヘッダ作るような軽さが求められる処理で、実行コストを支払いたくないんだよね。