最終更新日を表示しようとした時の苦労話
※これは私が独自に調べたものです。もしかしたらもっと簡単な方法があるかもしれません。
Internet Explorer 3.01(以下IE)での JavaScript の document.lastModified (文書を最後に更新した日時を文字列で返す)で返ってくる文字列は
木 1 16 12:00:00 1997
となります。ところが Netscape Navigator 3.0(以下NN)では
01/16/97 12:00:00
となります。この文字列をただ表示させるだけでは別に問題はないのですが、これを時間を表示させないで日付だけを表示させたかったので、この文字列を Date.parse で 1970年1月1日からのミリ秒に変換してから、setTime で Dateオブジェクトに変換して getYear, getMonth, getDate で日付だけを抽出しようとしました。
ところがこれは、NNではうまくいくのですが、IEでは1970年1月1日になってしまうのです。(ちなみにこの日付は、すべての日時をミリ秒であらわすときの基準の日付です。)
この理由を探していたところ、どうやら IE での parse の処理の不備と、Windows の地域の設定の「日付の表示方法」が絡んでいると分かりました。試しに上のNNで返す文字列をIEの Date.parse で変換させると、正しく表示されました。どうやらIEでの Date.parse は日本語が絡んだ日時文字列を正しく日時文字列として扱ってくれないようです。また、コントロールパネルの地域の設定で、「カレンダーの種類」を「西暦 (英語)」にすると、IEでの document.lastModified の戻り値は
Thu Jan 16 12:00:00 1997
となり、これだったらIEでも Date.parse で返ってくる値は正しくなります。というわけで、私は以下のような結論を導き出しました。
- 日本語の絡んだ日時文字列を正しく認識してくれない IE が悪い
- Windowsの地域設定を無視して、統一した(ある意味、自分勝手な)値を返す NN が悪い
というわけで、document.lastModified で NN 形式の値が返ってきたときは素直に Date.parse で返ってきた値を使い日付を抽出し、IE 形式の値が返ってきたときは、頭の漢字の曜日を削除し、日付を明確にするために月と日の間にスラッシュ(/)を追加してから、Date.parseを使って日付を抽出するようにしました。
ただこれは完全な方法ではなくて、前述した「カレンダーの種類」を「和暦」(元号で年を表す)にしているとだめです。ただこれは「和暦にしている人はほとんどいない」という私の勝手な独断で無視しようとしましたが、でもやっぱり無視しきれないので、表示は変わってしまいますが、document.lastModified で返ってきた値から時間部分だけを抜き取って表示することにしました。
ここまでの血のにじむような苦労から、最終的に出来上がった JavaScript のソースを以下に載せます。もし気に入っていただけたら、私の許可なくご自由に転載(自由に添削!?)してくださって結構です。
<SCRIPT LANGUAGE="JavaScript">
<!--
d1 = "" //文字列宣言
d1 = document.lastModified //最終更新日を得る
if (d1.indexOf("/") >= 0) { //もしNN形式だったら
} else { //もしIE形式だったら
d1 = d1.substring(d1.indexOf(" ")+1, d1.length) //曜日を抜き取る
d2=d1.substring(0, d1.indexOf(" "))+"/"+d1.substring(d1.indexOf(" ")+1, d1.length) //月と日の間にスラッシュを入れる
}
d3 = Date.parse(d2) //日時文字列を1970年1月1日からのミリ秒に変換する
if (d3 == 0) { //もし和暦で正常に変換できなかったら
d1 = document.lastModified //もう一度最終更新日を得る
d2 = d1.substring(0, d1.indexOf(":")-2)+d1.substring(d1.lastIndexOf(" "), d1.length) //時間部分だけを抜き取る
document.write("Last update : ", d2) //仕方なく表示する
} else { //正常に変換できたら
d = new Date() //Dateオブジェクトを宣言する
d.setTime(d3) //Dateオブジェクトに最終更新日を代入する
document.write("Last update : ", d.getYear(),"/", d.getMonth()+1,"/", d.getDate()) //喜んで表示する
}
-->
</SCRIPT>
ホームページに戻る
Copyright by 篠田 敦 (shinonon@jcom.home.ne.jp)