実現したいこと
JavaScriptを使って、土日祝日を除いた営業日の13時までは当日発送(今日の日付)、13時以降は1営業日後の日付(平日であれば翌日、土日祝は1営業日)を表示させたい。
前提
時間帯の条件分岐はできるのですが、祝日のカウントがされません。
(4/7を祝日指定しても4/7発送と出てしまう)
該当のソースコード
JavaScript
1const holiday = [ 2 '2023/4/6', 3 '2023/4/7' 4]; 5 6dayWek = new Array("日", "月", "火", "水", "木", "金", "土"); 7 8const objDate = new Date(); 9const objYMD = '(' + ((objDate.getMonth() + 1)) + '/' + objDate.getDate() + ')'; 10let shipDate = null; 11const hour = objDate.getHours(); 12 13function shippingExpress() { 14 if (!isHoliday(objDate) && hour <= 12) { 15 shipDate = objDate 16 } else { 17 shipDate = objDate.getDate() 18 do { 19 objDate.setDate(objDate.getDate() + 1); 20 21 if (!isHoliday(objDate)) { 22 shipDate = objDate 23 } 24 } while (shipDate === null) 25 } 26 27 if (shipDate !== null) { 28 const year = objDate.getFullYear(); 29 const month = objDate.getMonth() + 1; 30 const date = objDate.getDate(); 31 const weekday = dayWek[objDate.getDay()]; 32 const outputToday = document.getElementById("js-getToday"); 33 const outputScheduleDate = document.getElementById("js-shipTiming"); 34 outputToday.innerHTML = `${objYMD}`; 35 outputScheduleDate.innerHTML = `${year}<small>年</small>${month}<small>月</small>${date}<small>日</small><small>(${weekday})</small>`; 36 } 37} 38 39function isHoliday(date) { 40 objDate.getDay(date) == 6 || objDate.getDay(date) == 0 || holiday.includes(formatDate(date, 'YYYY/MM/DD')); 41} 42 43function formatDate(date, format) { 44 format = format.replace(/YYYY/, date.getFullYear()); 45 format = format.replace(/MM/, date.getMonth() + 1); 46 format = format.replace(/DD/, date.getDate()); 47 return format; 48}
よろしくお願いいたします。
isHolidayにdateを渡しているのに、objDateの土日判断をしていますね。
getDay()は引数は不要です。
function isHoliday(date) {
return date.getDay() == 6 || date.getDay() == 0 || holiday.includes(formatDate(date, 'YYYY/MM/DD'));
}
と修正してはいかがでしょうか。
コメントありがとうございます!修正してみたのですが、今日は土曜日で明日が日曜ですが明日発送の日付になっています。土日祝日判断がうまくできていないのでしょうか。。
isHoliayは、こちらでも動作確認できでます。
日付に応じてtrueとfalseが帰ります。
} else {
の次の行の
shipDate = objDate.getDate()
があるので、
do {
...
} while (shipDate === null)
が機能していません。
shipDate = objDate.getDate()
を削除かコメントにしてみるとどうなりますか?
実行する関数は、shippingExpressなのですよね。
せっかく、shipDateを求めているのに
代入する値はobjDateからになっているのが不思議です。
同じ値を参照しているので変わりはないのですが、
shipDateは条件判断だけに使っているということでしょうか。
2023/04/08 02:50 編集の
shipDate = objDate.getDate() を削除かコメントにしてみるとどうなりますか?
をスクリプトに反映(削除またはコメントアウト)してから、
if (shipDate !== null) {
の次の行に
console.log('shipDate: ' + shipDate);
console.log('objDate: ' + objDate);
を挿入してshipDate(objDateも同じものを参照)の値をログで見ることができます。
今日実行すると、
shipDate: Mon Apr 10 2023 HH:mm:ss GMT+0900 (Japan Standard Time)
objDate: Mon Apr 10 2023 HH:mm:ss GMT+0900 (Japan Standard Time)
(HH:mm:ssは実行時刻が入る)と表示されます
追加のコメントをいただきありがとうございます!!(確認が遅くなりました)
shipDate = objDate.getDate()
を削除すると無事に祝日もカウントして思い通りの表示をしてくれるようになったかと思います。
(今日が日曜日なので、明日を祝日設定にしてみて明日どう表示されるか確認してみます)
今回の即日発送部分以外にも◯日後発送の実装をしていて、先にobjDateを使っていたのとそのコードも参考にしつつ、他のコードも参考にしていたのでごっちゃになっていました。
おっしゃる通り
console.log('shipDate: ' + shipDate);
console.log('objDate: ' + objDate);
を入れると両方同じものが返ってきました。
普段はJavaScriptを自分で書くこと機会がほとんどなく、勉強してもしても毎回悩んだり忘れたりするので、とっても助かりましたm(_ _)m
ご親切にありがとうございました!
