![eyecatch](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnACKpDM8kph6OQ5OjZ-lVEIHlavmFZKLK7NUr7jtoQyLF3D4jBB-CgJG_OPwYZDaPF1iXX5fKedVYaVCjjZ7INaF19Qsg70dl-i_yMFWMegfyw5VbWTAJfS22HDf9qq3ZLbnrUmfUq9uFSB9t4NdKJT1YNy0D0XfFoiswvn8lGP5JH149vpjQWiMg/s1600-rw/calendar-4565243_1280.jpg)
カレンダーを制するものは、時を司る・・・、ワケないよね〜。下駄です。
本日のIT謎掛け
「date関数」とかけまして・・・
「スポーツの競技中に怪我をした場合」と、ときます。
そのココロは・・・
タイムをとります。
ネットで見かける日付操作の落とし穴
カレンダー機能を作っていた時に、次の月や前の月に、移動するボタンを設置する必要がでてきました。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinq0IzpBw4uStRCGMJUEk2eTBGJWybid2j_wK-MaA2lmZ1Sc2jbOgKc0zIcaq3aK_GRn9jBfbr2s6OJBDXOp78QxOV9RI7ZZrkuExMzvshw7TwrnU-mUotg2D62IefOn2kD2cGkQgOFXpWFuY0Fo2dfgvsYndzXgxauRKEMfWCk1y-wdKx5Sk5bIkx/s1600-rw/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2020-04-29-7.45.29.png)
そして、出来上がった関数は以下のようなプログラムです。
function month_move(y , m , move_month){
var d = new Date(Number(y) , Number(m) -1 , 1);
d.setMonth(d.getMonth() + move_month);
return{
y : d.getFullYear(),
m : d.getMonth() +1
};
};
年と月と、移動する月数を"month_move()"という関数に送ると、結果の年と月が返ってくるという関数です。
month_move(2020,1,+1)
> {y: 2020, m: 2}
month_move(2020,2,+1)
> {y: 2020, m: 3}
month_move(2020,3,+1)
> {y: 2020, m: 4}
month_move(2020,12,+1)
> {y: 2021, m: 1}
month_move(2021,1,+1)
> {y: 2021, m: 2}
month_move(2021,2,+5)
> {y: 2021, m: 7}
month_move(2021,1,-1)
> {y: 2020, m: 12}
正常に取得できますね。
+1dで翌月、-1で前月を取得でき、年またぎもうまくいっています。
もちろん、+1,-1以外にも、数ヶ月先にも対応できています。
ちょっとだけプログラム解説
javascriptには、phpの"strtotime"というような便利な関数は用意されていないので、今回のプログラムでは、"new Date()"関数で、日付オブジェクトを作って、その中で、数カ月後の月にセットをして、その日付オブジェクトから、年と月を取得しています。
さほど難しい要素はないのですが、2行目の、
var d = new Date(Number(y) , Number(m) -1 , 1);
ここで、日付オブジェクトを作成して、います。
ポイントは基準になる年月をセットする点ですね。
この値を入れないと、基準日が今現在になってしまいます。
そして、日は、月初の1日に固定しています。
次に、3行目の箇所が、月移動の処理です。
d.setMonth(d.getMonth() + move_month);
年またぎ処理は、内部で13月という値を渡すと、年も翌年に変換してくれるという、便利ポイントがあるので、非常にありがたい限りです。
0 件のコメント:
コメントを投稿