🐴
Javascript:new Date(year,month,day)の落とし穴
結論
背景
仕事でちょっと必要になったので、渡した日付の週の平日(月〜金)を取得する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