質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

1163閲覧

JavaScriptで土日祝日を除いた即日発送表示がしたい

nana7777

総合スコア7

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2023/04/06 15:05

実現したいこと

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}

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YellowGreen

2023/04/06 22:31

isHolidayにdateを渡しているのに、objDateの土日判断をしていますね。 getDay()は引数は不要です。 function isHoliday(date) { return date.getDay() == 6 || date.getDay() == 0 || holiday.includes(formatDate(date, 'YYYY/MM/DD')); } と修正してはいかがでしょうか。
nana7777

2023/04/07 15:49 編集

コメントありがとうございます!修正してみたのですが、今日は土曜日で明日が日曜ですが明日発送の日付になっています。土日祝日判断がうまくできていないのでしょうか。。
YellowGreen

2023/04/07 17:50 編集

isHoliayは、こちらでも動作確認できでます。 日付に応じてtrueとfalseが帰ります。 } else { の次の行の shipDate = objDate.getDate() があるので、 do { ... } while (shipDate === null) が機能していません。 shipDate = objDate.getDate() を削除かコメントにしてみるとどうなりますか?
YellowGreen

2023/04/08 02:07 編集

実行する関数は、shippingExpressなのですよね。 せっかく、shipDateを求めているのに 代入する値はobjDateからになっているのが不思議です。 同じ値を参照しているので変わりはないのですが、 shipDateは条件判断だけに使っているということでしょうか。
YellowGreen

2023/04/08 02:18

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は実行時刻が入る)と表示されます
nana7777

2023/04/09 14:49 編集

追加のコメントをいただきありがとうございます!!(確認が遅くなりました) shipDate = objDate.getDate() を削除すると無事に祝日もカウントして思い通りの表示をしてくれるようになったかと思います。 (今日が日曜日なので、明日を祝日設定にしてみて明日どう表示されるか確認してみます) 今回の即日発送部分以外にも◯日後発送の実装をしていて、先にobjDateを使っていたのとそのコードも参考にしつつ、他のコードも参考にしていたのでごっちゃになっていました。 おっしゃる通り console.log('shipDate: ' + shipDate); console.log('objDate: ' + objDate); を入れると両方同じものが返ってきました。 普段はJavaScriptを自分で書くこと機会がほとんどなく、勉強してもしても毎回悩んだり忘れたりするので、とっても助かりましたm(_ _)m ご親切にありがとうございました!
guest

回答1

0

js

1function isHoliday(date) { 2// ↓ 少なくともこれが必要 3 return objDate.getDay(date) == 6 || objDate.getDay(date) == 0 || holiday.includes(formatDate(date, 'YYYY/MM/DD')); 4}

投稿2023/04/06 17:16

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nana7777

2023/04/07 15:47

回答ありがとうございます!return 抜けていました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問