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

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

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

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

Q&A

解決済

4回答

5764閲覧

JSで、指定した日程から50営業日後の日付を計算したい

tomato01

総合スコア82

JavaScript

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

0グッド

0クリップ

投稿2021/12/06 06:57

JSで、指定した日程から50営業日後の日付を計算したいと思っています。

尚、指定した日程から「50日後」の日付を計算することはできたのですが、
「50営業日後(日曜・祝祭日は営業日にカウントしない)」の計算方法がわかりません。

例えば、5営業日で日曜と祝日が1日はさむ場合、日曜と祝日は営業日にカウントせず、
結果的に指定した日から7日後の日数を取得するみたいな処理にしたいです。

■現在の処理の流れ ※下記の2項目は対応済みです
1、日付をカレンダーから指定
2、指定した日程から50日後の日付を計算する(ここを50営業日後に変更をしたいです)

<body> <input type="date" id="today"> <p id="date011">設定日から50日後の日付が表示されます</p> <p>※日曜を挟む場合は翌日になります</p> <p>日曜が何回あるか?</p> <script> //カレンダー表示用 window.onload = function () { var today = new Date(); today.setDate(today.getDate()); var yyyy = today.getFullYear(); var mm = ("0" + (today.getMonth() + 1)).slice(-2); var dd = ("0" + today.getDate()).slice(-2); document.getElementById("today").value = yyyy + '-' + mm + '-' + dd; } //入力した日付を取得 var value = 0; function inputChange(){ var textbox = document.getElementById("today") value = textbox.value console.log("値の表示:" + value ); dateFunction011(); }; const textbox = document.getElementById("today") textbox.addEventListener('change', inputChange); //日付が選択された際の処理 function dateFunction011() { //日付オブジェクトを作成する var dd = new Date(value); //取得した曜日に特定の日数を追加する dd.setDate(dd.getDate() + 50); var month2 = dd.getMonth() + 1; //曜日取得 var day = dd.getDay(); //if (day == 0) { // dd.setDate(dd.getDate() + 1); //}; var day_base = dd.getDay(); var day_changed = ''; switch (day_base) { case 0: day_changed = "日曜日"; break; case 1: day_changed = "月曜日"; break; case 2: day_changed = "火曜日"; break; case 3: day_changed = "水曜日"; break; case 4: day_changed = "木曜日"; break; case 5: day_changed = "金曜日"; break; case 6: day_changed = "土曜日"; break; }; var pelem011 = document.getElementById("date011"); pelem011.innerHTML = "50日後の日付: " + dd.getFullYear() + "年" + month2 + "月" + dd.getDate() + "日" + day_changed; } </script> </body>

■この後に行う予定の処理 ※こちらが知りたい内容になります
3、日曜を営業日から除外をして計算をする
(指定した日程から50日間の間で日曜が何日あるかカウントする方法が知りたいです。)

4、祝日に指定してある日程は除外して計算をする
(通常、どのような形で除外日(祝日)を設定し、除外日が何日あるかカウントする方法が知りたいです。)

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

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

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

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

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

guest

回答4

0

(指定した日程から50日間の間で日曜が何日あるかカウントする方法が知りたいです。)

日付の差を7で割って、開始日と終了日の曜日で調整すればいいかと思います。

(通常、どのような形で除外日(祝日)を設定し、除外日が何日あるかカウントする方法が知りたいです。)

祝日を配列に登録した祝日テーブルを作り、その中で期間中に該当するものを検索して、日曜日でないものを数える。

投稿2021/12/06 07:14

otn

総合スコア85901

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

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

tomato01

2021/12/06 08:16

ご回答を頂きありがとうございます。なんとなくイメージがつかめましたのでトライしてみたいと思います!
guest

0

library使うのもありと思います。
https://github.com/kalmecak/moment-business-days

投稿2021/12/06 07:27

heroyct

総合スコア434

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

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

0

ベストアンサー

営業日カレンダーを作っておくしかありません
祝日はコロコロ変わるものなので計算で導くことは混乱の元にしかなりません

sample

javascript

1const today="2021-12-06"; 2// (1)今日の日付 3const interval=50; 4// (2)求めたいn日後 5const holiday=["2022-01-01","2022-01-10","2022-02-11","2022-02-23"].map(x=>new Date(x).getTime()); 6// (3)祝日のリスト作成 7const d1=new Array(interval*2).fill(null).map((_,x)=>new Date(today).getTime()+60*60*24*1000*(x+1)); 8// (4)余裕をもって求めたいn日後の2倍の日付を配列に保持 9const d2=d1.filter(x=>!holiday.includes(x)&&new Date(x).getDay()>0).map(x=>new Date(x)); 10// (5)祝日に含まれるか、日曜日を除く 11console.log(d2[interval-1]); 12// (6)n日後を取り出すため1引いて参照

投稿2021/12/06 07:03

編集2021/12/06 08:30
yambejp

総合スコア116724

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

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

tomato01

2021/12/06 07:08

ご回答を頂きありがとうございます。 営業日カレンダーを作りたいと思っておりますが、どのような形で判定して計算をすればできそうでしょうか。
tomato01

2021/12/06 08:20

ご回答を頂き誠にありがとうございます。こういったやり方があるのですね!こちらは、日曜の処理もされているように見えるのですがコードで言うとどのあたりで記載をしているのでしょうか(私の知識不足で見方がわからずすみません。)尚、仮に祝日に設定した曜日が日曜だった場合は、どのような処理になるのでしょうか。
tomato01

2021/12/06 08:26

すみません、下記日程でチェックをするとundefiedになってしまうのですが何か理由がありそうでしょうか。 const today="2021-12-23"; const interval=4; const holiday=["2021-12-26","2021-12-27","2021-12-28","2021-12-29","2021-12-30"].map(x=>new Date(x).getTime()); const d=new Array(interval*2).fill(null).map((_,x)=>new Date(today).getTime()+60*60*24*1000*(x+1)).filter(x=>!holiday.includes(x)&&new Date(x).getDay()>0).map(x=>new Date(x)); console.log("参考" + d[interval-1]);
tomato01

2021/12/06 08:33

ご回答を頂き誠にありがとうございます。コメントの記載誠にありがとうございます!内容理解致しました。どうもありがとうございます。
yambejp

2021/12/06 08:33

解説つけておきました。 > 下記日程でチェックをするとundefiedになってしまう 余裕を2倍で見ていたのでもっと大量にとればいいでしょう。 (2倍+10日とか、10倍とか) 8日しか余裕見てなかったので休みがそれを超えています。
tomato01

2021/12/06 08:46

かしこまりました!ありがとうございます。
guest

0

指定した日程から50日間の間で日曜が何日あるかカウントする方法

******0 1234567 8901234 5678901 2345678 9012345 6789012 3456789 0******

ということで、指定した日が土曜日なら8日、それ以外なら7日です。
(指定した日をスキップのカウントに含めない場合)


祝日に指定してある日程は除外して計算をする

安直ですが、祝日を配列に詰めて、57日間(58日間)を頭からループし、それぞれが配列に含まれるようなら期間を1日延ばす、というロジックを思いつきました。(なので while がいいと思います。)

その他、「javascript 営業日 計算」でググるといいかもしれません。

投稿2021/12/06 07:37

Lhankor_Mhy

総合スコア36960

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問