lastModifiedを綺麗に表示するには?

トップ > アラカルト > lastModifiedを綺麗に表示するには?

はじめに

JavaScript の lastModified を表示すると、2000年12月31日を米国式に「12/31/2000」と表示したり、9時間ずれたタイムゾーンで時刻を表示したり、いろいろと問題があります。どうすれば、lastModified の値を日本人好みのフォーマットで表示できるか、ブラウザの実装情報を集めてみました。(ご協力いただいた皆様ありがとうございました。)

実験詳細

実験したソースは以下のようなものです。

d1 = new Date(document.lastModified);
d2 = new Date(2000, 11, 31, 23, 59, 59);
document.writeln("<pre>");
document.writeln(navigator.userAgent);
document.writeln("(1) " + document.lastModified);
document.writeln("(2) " + d1);
document.writeln("(3) " + d2.toString());
document.writeln("(4) " + d2.toLocaleString());
document.writeln("(5) " + d2.toGMTString());
document.writeln("(6) " + d2.toUTCString());
document.writeln("(7) " + d2.getYear());
document.writeln("</pre>");
(1) document.ladtModifiedをそのまま表示する。
(2) document.ladtModifiedをDate()で解釈して表示する。
(3) DateオブジェクトをtoString()で変換して表示する。
(4) DateオブジェクトをtoLocalString()で変換して表示する。
(5) DateオブジェクトをtoGMTString()で変換して表示する。
(6) DateオブジェクトをtoUTCString()で変換して表示する。
(7) DateオブジェクトのgetYear()の値を表示する。

比較しやすいように、日付は 2000/12/31(日) 23:59:59 に統一しています。そのブラウザでサポートされていない関数や問題の発生する関数は // でコメントアウトして実行します。

Internet Explorer 6.0

Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)
(1) 12/31/2000 23:59:59
(2) Sun Dec 31 23:59:59 UTC+0900 2000
(3) Sun Dec 31 23:59:59 UTC+0900 2000
(4) 2000年12月31日 23:59:59
(5) Sun, 31 Dec 2000 14:59:59 UTC
(6) Sun, 31 Dec 2000 14:59:59 UTC
(7) 2000

Internet Explorer 5.0

Mozilla/4.0 (compatible; MSIE 5.0; Windows 95)
(1) 12/31/2000 23:59:59
(2) Sun Dec 31 23:59:59 UTC+0900 2000
(3) Sun Dec 31 23:59:59 UTC+0900 2000
(4) 12/31/2000 23:59:59
(5) Sun, 31 Dec 2000 14:59:59 UTC
(6) Sun, 31 Dec 2000 14:59:59 UTC
(7) 2000

Internet Explorer 4.0

Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)
(1) 12/31/2000 14:59:59   ← 9時間ずれている
(2) Mon Dec 31 14:59:59 UTC+0900 1900 ← 間違ってる
(3) Sun Dec 31 23:59:59 UTC+0900 2000
(4) 12/31/2000 23:59:59
(5) Sun, 31 Dec 2000 14:59:59 UTC
(6) Sun, 31 Dec 2000 14:59:59 UTC
(7) 2000

Internet Explorer 3.0

Mozilla/2.0 (compatible; MSIE 3.02; Update a; Windows 95)
(1) 日 12 31 23:59:59 2000 ← わかりづらい
(2) Thu Jan 01 09:00:00 1970 ← 間違ってる
(3) Sun Dec 31 23:59:59 2000
(4) 12/31/00 23:59:59
(5) Sun, 31 Dec 2000 14:59:59 GMT
(6) 未サポート。
(7) 100

Netscape 6.1

Mozilla/5.0 (Windows; U; Win98; ja-JP; rv:0.9.2) Gecko/20010726 Netscape6/6.1
(1) Sunday, December 31, 2000 23:59:59
(2) Sun Dec 31 23:59:59 GMT+0900 2000
(3) Sun Dec 31 23:59:59 GMT+0900 2000
(4) Sunday, December 31, 2000 23:59:59
(5) Sun, 31 Dec 2000 14:59:59 GMT
(6) Sun, 31 Dec 2000 14:59:59 GMT
(7) 100

Netscape Communicator 4.7(Win)

Mozilla/4.7 [ja] (Win98; I)
(1) Sunday, December 31, 2000 23:59:59
(2) Sun Dec 31 23:59:59 GMT+0900 (???? (?W????)) 2000
(3) Sun Dec 31 23:59:59 GMT+0900 (???? (?W????)) 2000
(4) Sunday, December 31, 2000 23:59:59
(5) Sun, 31 Dec 2000 14:59:59 GMT
(6) Sun, 31 Dec 2000 14:59:59 GMT
(7) 100

Netscape Communicator 4.7(Mac)

Mozilla/4.71 (Macintosh; I; PPC)
(1) Dec 11 12:24:30 1929 ← 大嘘
(2) Wed Dec 11 12:24:30 GMT-1500 1929 ← 大嘘
(3) Sun Dec 31 23:59:59 GMT-1500 2000
(4) Dec 31 23:59:59 2000
(5) Mon, 01 Jan 2001 14:59:59 GMT ← 大嘘
(6) Mon, 01 Jan 2001 14:59:59 GMT ← 大嘘
(7) 100

Netscape Communicator 4.08(UNIX(VineLinux)版)

Mozilla/4.08 [Vine-ja] (X11; I; Linux 2.0.36 i586)
(1) Sun 31 Dec 2000 11:59:59 PM JST
(2) Invalid Date ← 解釈できない
(3) Sun Dec 31 23:59:59 GMT+0900 (JST) 2000
(4) Sun 31 Dec 2000 11:59:59 PM JST
(5) Sun, 31 Dec 2000 14:59:59 GMT
(6) Sun, 31 Dec 2000 14:59:59 GMT
(7) 100

Netscape Communicator 4.06~4.51

Mozilla/4.08 [en] (WinNT; I ;Nav)
(1) 12/31/00 23:59:59
(2) Mon Dec 31 23:59:59 GMT+0900 (???? (?W????)) 1900
(3) Sun Dec 31 23:59:59 GMT+0900 (???? (?W????)) 2000
(4) Sunday, December 31, 2000 23:59:59
(5) Sun, 31 Dec 2000 14:59:59 GMT
(6) Sun, 31 Dec 2000 14:59:59 GMT
(7) 100

Netscape Navigator/Communicator 3.0~4.05

Mozilla/4.01 [ja] (Win95; I)
(1) 12/31/00 23:59:59
(2) Mon Dec 31 23:59:59 東京 (標準時) 1900
(3) Sun Dec 31 23:59:59 東京 (標準時) 2000
(4) 12/31/00 23:59:59
(5) Sun, 31 Dec 2000 14:59:59 GMT
(6) 未サポート
(7) 2000

Netscape Navigator 2.0X

Mozilla/2.01I (Win95; I)
(1) Sun Dec 31 23:59:59 2000
             lastModifiedの後に改行がはいる
(2) ブラウザがアプリケーションエラー
(3) Sun Dec 31 23:59:59  2000
(4) 12/31/00 23:59:59
(5) Sun, 31 Dec 2000 14:59:59 GMT
(6) 未サポート
(7) 100

HotJava 3.0

Mozilla/3.0 [ja] (compatible; HotJava; x86)
(1) Sun Dec 31 23:59:59 JST 2000
(2) Invalid Date ← 解釈できない
(3) Sun Dec 31 23:59:59 GMT+0900 (GMT+09:00) 2000
(4) 2000/12/31 23:59:59:GMT+09:00
(5) Sun, 31 Dec 2000 14:59:59 GMT
(6) Sun, 31 Dec 2000 14:59:59 GMT
(7) 100

結論

すみません。集めた情報から、適切な回答をひねり出そうとしたのですが、各ブラウザの実装があまりにもひどくて・・・実際のところ、次のような善後策しかないように思います。

  1. 綺麗に表示するのをあきらめて、そのまま lastModified を表示してしまう。
    → IE4.*(Win)で9時間ずれたり、Netscape 4.7(Mac)で大嘘になるのはあきらめる。
  2. 古いブラウザへの対応をあきらめて、Date()で解釈してから整形する。
    → IE5.0以降、Netscape 4.7(Win)以降はOKだけど、IE4.0やNetscape 4.7(Mac)は駄目。
  3. 上記の実験結果から、それぞれのブラウザに応じてブラウザ依存の解釈ルーチンを書き上げる。
    http://www.bigfoot.com/~chaoh/clm/ (by chaohさん)

例えば同じ IE4.0(Win) でも、Mshtml.dll の修正プログラムを適用すると日付の解釈や表示が変わってしまうという報告をいただきました。lastModified は・・・素直にそのまま表示した方が無難そうですね・・・(2002.2.3追記)


Copyright (C) 2000 杜甫々
初版:2000年12月24日、最終更新:2002年3月2日
http://www.tohoho-web.com/wwwxx033.htm