lastModifiedを綺麗に表示するには?
目次
- はじめに
- 実験詳細
- Internet Explorer 6.0
- Internet Explorer 5.0
- Internet Explorer 4.0
- Internet Explorer 3.0
- Netscape 6.1
- Netscape Communicator 4.7(Win)
- Netscape Communicator 4.7(Mac)
- Netscape Communicator 4.08(UNIX(VineLinux)版)
- Netscape Communicator 4.06~4.51
- Netscape Navigator/Communicator 3.0~4.05
- Netscape Navigator 2.0X
- HotJava 3.0
- 結論
はじめに
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
- toLocaleString()が日本語を返すようになった。OSの設定?
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
- 環境変数TZを設定しても9時間のずれは直らない。(Windows版で確認)
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
- NT版では(2)が「Wed Dec 31 16:00:00 1969」になるとの情報もあり。
- NT版では(5)が「Mon, 01 Jan 2001 07:59:59 GMT」になるとの情報もあり。
- 1970年1月1日00:00:00GMTは、UNIXにおける時計の初期値。
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
- (???? (?W????)) の問題が直っている。
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
- とりあえず日付の解釈は問題無し。
- (???? (?W????)) のような変な表示になってしまう。
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
- (1), (2) は、2000/01/16 18:52修正のソースでの値。
- 使い物になりませんね。
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
- やはり、UNIX版になるとフォーマットも仕様も異なっている。
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
- 12/31/00を1900年と解釈してしまう。
- 「東京 (標準時)」の代わりに「PST」や「JST」が表示されたりもする。
- Netscape 4.04ではすでに toUTCString()がサポートされているとの情報も。
- Netscape 3.03で(5)が「Mon, 01 Jan 2001 07:59:59 GMT」になるとの情報も。
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
- lastModifiedではなく、Date("11/31/2000") でも発生。
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
結論
すみません。集めた情報から、適切な回答をひねり出そうとしたのですが、各ブラウザの実装があまりにもひどくて・・・実際のところ、次のような善後策しかないように思います。
- 綺麗に表示するのをあきらめて、そのまま lastModified を表示してしまう。
→ IE4.*(Win)で9時間ずれたり、Netscape 4.7(Mac)で大嘘になるのはあきらめる。 - 古いブラウザへの対応をあきらめて、Date()で解釈してから整形する。
→ IE5.0以降、Netscape 4.7(Win)以降はOKだけど、IE4.0やNetscape 4.7(Mac)は駄目。 - 上記の実験結果から、それぞれのブラウザに応じてブラウザ依存の解釈ルーチンを書き上げる。
→ http://www.bigfoot.com/~chaoh/clm/ (by chaohさん)
例えば同じ IE4.0(Win) でも、Mshtml.dll の修正プログラムを適用すると日付の解釈や表示が変わってしまうという報告をいただきました。lastModified は・・・素直にそのまま表示した方が無難そうですね・・・(2002.2.3追記)
Copyright (C) 2000-2002 杜甫々
初版:2000年12月24日、最終更新:2002年2月3日
https://www.tohoho-web.com/wwwxx033.htm