経過日数を表示するスクリプト-訂正版

ある特定の日から何日経過したかを「何年何か月何日」と表示するスクリプトです。

function keika(nen, tsuki, hi, nenhyoki) {
 var fd = new Date(nen, tsuki - 1, hi);
 var td = new Date();
 var ld = new Date(td.getFullYear(), td.getMonth(), 0);
 var dify, difm, difd;
 var yflg = 0;
 var mflg = 0;
 var hyoji = "";
 difd = td.getDate() - fd.getDate();
 if(difd < 0) {
  if(ld.getDate() >= fd.getDate()) {
   difd = ld.getDate() + difd;
  } else {
   difd = td.getDate();
  }
  mflg = 1;
 }
 difm = td.getMonth() - fd.getMonth() - mflg;
 if(difm < 0) {
  difm += 12;
  yflg = 1;
 }
 dify = td.getFullYear() - fd.getFullYear() - yflg;
 if(dify > 0) hyoji += dify + nenhyoki;
 if(difm > 0) hyoji += difm + "か月";
 if(difd > 0) hyoji += difd + "日";
 return hyoji;
}
document.write("ナッチャン"+keika(2000,8,5,"歳"));
document.write("
タクチャン"+keika(2002,9,9,"歳"));
document.write("
ヒーチャン"+keika(2004,6,6,"歳"));

本当に申し訳ありません。
以前、経過日数を表示するスクリプト-年月日版を書きましたが、間違いがありました。

誕生日からの経過年月日を表示する場合、影響があるのは、誕生日が29日、30日、31日の場合です。
たとえば8月31日から10月26日までの経過年月日は「1か月26日」となるべきところですが「1か月25日」となっていました。
「応当する日がない場合は末日とする」というルールが反映されていなかったのです。
毎月おかしくなるわけではなく、誕生日が31日の場合は、3月、5月、7月、10月、12月のときだけです。誕生日が29日、30日の場合は3月のときだけです。
誕生日が28日以前の場合、あるいは「直すのが面倒」とか「こんなルール関係ない」とか「ずれが1日だけなら問題ない」とか「何を細かいことを」という人は前のままでもおそらく大丈夫です。
また、getYearというメソッドを使っていましたが、これは2000年問題が発生するので(これを回避するため1900を減じるということをしていました)、getFullYearにすべきでした。

さて、使い方は次の通りです。

スクリプトの中の最後の3行を変えてみてください。
もちろん1行だけ残して他は削除しても構いません。行を追加してもよいです。
keika(nen,tsuki,hi,nenhyoki)に年、月、日、"歳"(または"年")をセットすると「○歳○か月○日」という文字列になります。年齢ならば"歳"、年数ならば"年"とするのがよいでしょう。
ナッチャンは2000年8月5日生まれなのでkeika(2000,8,5,"歳")とします。
これをdocument.write(~)という命令で書き込みます。
1行だけならばただ貼りつけて誕生日を入れるだけでよいですが、2行以上にするときはレイアウトを考えないとうまく表示されないのでHTMLの知識が必要になるかもしれません。

前の版だと3人分の経過年月日を表示するためには同じスクリプトを3回書く必要がありますが、この「関数型」だと実際に書き込む部分だけを繰り返せばよいので便利です。

関連記事

[2004-10-26(Tue)]

デジタル・インターネット

Sleipnirに不具合? | 秀丸エディタのマクロ「rdfwriter」

© 2014 You Look Too Cool