🐴

Javascript:new Date(year,month,day)の落とし穴

2021/03/11に公開

結論

背景

仕事でちょっと必要になったので、渡した日付の週の平日(月〜金)を取得するScriptのサンプルを書いた。
テストしてみたところ、返ってくる配列データが意図していないものになっており
15分くらいハマったので腹いせに書いた。

(参考)書いたソースコード

weekDayPicker関数にdate型を渡すとその週の平日を返したかった。
:::Message alert
※月末月初のN/1〜N/6,N/24〜30の日付を渡すと月マタギが発生してエラーを吐きますが、これは既知の問題です。というか色々と未完成。
とりあえず基本ロジック確認したかっただけだし。
例外処理書くほどでもなかったし(震え声)
:::

function weekDayPicker (date){

if(date===undefined)
    {
    var date = new Date () ; // Today Date
}

    var dateData = [];
    var dayOfWeek = date.getDay();

    var nYear = date.getFullYear();
    var nMonth = date.getMonth();
    var nDate = date.getDate();

    for (var i =dayOfWeek;i<6;i++){//今日の日付〜金曜まで取得
        var counter = (i - dayOfWeek+1); // 日曜始まりならば0から始まり、+1してるので月曜  土曜始まりならば+1されて日曜 =0
        var datePlus = new Date(nYear,nMonth,nDate +counter); 
        var dayOfWeekPlus = datePlus.getDay();
    if (dayOfWeekPlus == 6 || dayOfWeekPlus == 0  ){ //土曜ならば
        i = 7
    }
    else{ //それ以外 月曜〜金曜まで
        dateData.push(datePlus);
    }

    }

for (var k =dayOfWeek;k<6;k++){
    var counter = (k - dayOfWeek+1); // 月曜はじまりならば -1されて日曜 、土曜始まりならば-1されて金曜
    var dateMinus = new Date(nYear,nMonth,(nDate-counter)); 
    var dayOfWeekMinus = dateMinus.getDay();
if (dayOfWeekMinus == 0 || dayOfWeekPlus == 6){
    k = 7
}
else{
    dateData.push(dateMinus);
}
}
if(dateData.length=4){
    dateData.push(date);    
}

dateData.sort(function(a, b){
	return (a > b ? 1 : -1);
});

return dateData;
}

テスト結果

date = new Date(2021,3,11).getDay()
Result -> 0

🐴 「は?なんで0なん?日曜??」

カレンダーで4/11の曜日を確認→解決

原因

new Date(year,month,day)やらgetMonth()やらの数値は0始まりなので
1月 = 0
2月 = 1
となる。

結論(再掲)

memo

ちゃんとしたソースにするか悩んでる。

以上

Discussion