JavaScriptを使って、今日の日付から1ヶ月前を計算するコードを、変数を使う方法とそうでない方法の2つを紹介します。この2つは、コードの書き方に違いがあるので注意が必要です。なお、数字、符号を変えることで、2ヶ月前、1ヶ月後に対応することができます。まず、全体のコードを紹介してから、順をおって説明していきます。
*リクエストがあり、考え直したところ、僕のやり方は単純に月を前後させる方法になりことがわかりました。細かいところまで計算をすることを考えてませんでした。勉強になりました。
##仕様の確認
前提として「1ヶ月前」「1ヶ月後」の意味を定義します。
2015年1月31日の1ヶ月後を何月何日としましょう。2015年2月の同日にしたいのですが、同日に当たる日がない場合…
- 月の最終日: 2015年2月28日
- 翌月の一日: 2015年3月1日
- 月の最終日から、余った日数だけ進めた日: 2015年3月3日
ここでは、3. の 月の最終日から、余った日数だけ進めた日: 2015年3月3日 を同日に当たる日がない場合の「nヶ月後」と定義します(これは、JavaScriptの日付計算の仕様にそのまま沿った仕様です。これ以外の仕様が要求されている場合、独自の補正処理を自前で書く必要があります)。
##3つのポイント
var dt = new Date();
var month = dt.getMonth()+1;
var day = dt.getDate();
//1ヶ月前
var lastMonth = dt.setMonth(month -2);
var lastmonth = dt.getMonth()+1;//変数の場合は、+1
/*var lastMonth = dt.setMonth(dt.getMonth() -1);
var lastmonth = dt.getMonth()+1;変数なしの場合は、引いた数と同数を指定。*/
//2ヶ月前
var twoMonth = dt.setMonth(month -3);
var twomonth = dt.getMonth()+1;
/*var twoMonth = dt.setMonth(dt.getMonth() -2);
var twomonth = dt.getMonth()+2;*/
document.write = (lastmonth + "月" + day + "日~"+ month + "月" + day + "日 ");//変数と文字列結合
1. new dateから、今日の日付を抜き出す。
new dateには、年 月 日にち 場所など多くの情報が含まれています。そこから、計算に必要な月と日にちを変数に指定して抜き出します。
var dt = new Date();
var month = dt.getMonth() +1;
var day = dt.getDate();//日にち
- 月は、1を足す。
JavaScriptで日付を取得すると、月は0~11月で取得されます。そこで、var month = dt.getMonth()+1;
とすれば1~12月で表示することができます。
2. 1ヶ月前を計算する
1ヶ月前を計算するには、getMonthとsetMonthの異なる2つを使います。
- getMonth・・・newdateの月を取得します。
- setMonth・・・任意の月を表示させます。基本的な使い方として
var lastMonth = dt.setMonth()
があり、var lastMonth = dt.setMonth(6);
で7月を表示します。
しかし、これでは毎月の変化に対応することができません。そこで、次のように組み合わせて書くことで、何月になっても必ず1つ前の月を表示することができます。
変数を使わない方法
var lastMonth = dt.setMonth(dt.getMonth() -1);
変数を使った方法
変数var month = dt.getMonth() +1;
を使って次のように書くことも出来ます。
変数を使わない方法では、元々の0~11月の並びを-1することで先月を計算しました。変数は、+1されているので1+X=-1にする必要があります。右辺と左辺と移行して、X=-2となります。
3.最後に、var lastmonth = dt.getMonth()+X;を書く
しかし、上記のコードの書き方では、数字の羅列で表示されてしまいました。これは、setMonthでXヶ月前を計算するコードのあとに、var lastmonth = dt.getMonth()+X
と書くことで解決しました。なお、変数を使った計算の場合は、getMonthのあとはXヶ月前にかかわらず+1で問題ありませんでした。
*このコードをなぜ書かないといけないのかは、あとで調べてみます
var lastMonth = dt.setMonth(dt.getMonth() -1);
var lastmonth = dt.getMonth()+1;//-1をしたら、+1
var twoMonth = dt.setMonth(dt.getMonth() -2);
var twomonth = dt.getMonth()+2;//-2をしたら+2
あとは、それぞれの変数を文字列結合で結合していくと、テキストで表示することができます。