JSで土日祝を除いた日数または土日祝のみをカウントする方法
JavaScriptまたはjQueryで、土日祝を除いた日数 または 土日祝のみをカウントする方法をご紹介します。
サンプル
日付を入力してください
は、今日から
日後で
平日は 日間あって
土日祝日は 日間あります。
的なプログラムが作れます。
目次
日付計算と土日祝ライブラリ
まずは予備知識として、日付の計算方法と、土日祝を判定する方法について。
単純に2つの日付の差を求めたいだけであれば
このような方法で数えることができますが
let date1 = new Date('2023-10-01');
let date2 = new Date('2023-10-11');
return Math.ceil((date2 - date1) / 86400000); // 10
今回は土日祝かどうかを判定するため、日付を一つ一つ見ていかなければなりません。
なのでおよそこのような方法で数えます。
let date1 = new Date('2023-10-01');
let date2 = new Date('2023-10-11');
let count = 0;
//date2のほうが大きい間、date1に+1していく
while(date2 >= date1){
//date1に+1日
date1.setDate(date1.getDate() + 1);
//曜日を取得 0=日 6=土
let week = date1.getDay();
//祝日かどうか (祝日なら祝日名が、じゃなければundefined)
let is_holiday = JapaneseHolidays.isHoliday(date1);
//土日でも祝日でもないとき
if(week != 0 && week != 6 && !is_holiday){
++count;
}
}
return count; // 5
ここで、祝日を判定するために、こちらのライブラリをお借りしています。
このようにすると、祝日の場合、変数「is_holiday」に祝日の名前が。
祝日じゃない場合はundefinedが入ります。
<script src="https://cdn.rawgit.com/osamutake/japanese-holidays-js/v1.0.10/lib/japanese-holidays.min.js"></script>
<script>
let date = new Date();
let is_holiday = JapaneseHolidays.isHoliday(date);
</script>
平日のみカウント
以下のようなコードで、平日のみカウントすることができます。
//平日をカウント
function weekdays(input){
//今日を取得
let today = new Date();
//カウント
let count = 0;
//inputがtodayより大きい間、todayに+1していく
while(input >= today){
//todayに+1日
today.setDate(today.getDate() + 1);
//曜日を取得 0=日 6=土
let week = today.getDay();
//祝日かどうか (祝日なら祝日名が、じゃなければundefined)
let is_holiday = JapaneseHolidays.isHoliday(today);
//土日でも祝日でもないとき
if(week != 0 && week != 6 && !is_holiday){
++count;
}
}
return count;
}
weekdays(new Date('2023-10-11')); // 8 (今日が2023-10-01だとしたら)
whileで日付を一つ一つ見ていき、平日のみ count+1 します。
ただこれだと「input」が「today」より小さい時 つまり過去のとき
while文に入れず数えられないので 過去にも対応するには の章をご覧ください。
また、先述の通り、「japanese-holidays-js」の読み込みをお忘れなく。
土日祝日のみカウント
ここまで来れば結構簡単で、
土日祝日のみカウントするには、先ほどのコードの16行目のif文を
このようにすればできます。
//土日または祝日のとき
if(week == 0 || week == 6 || is_holiday){
平日または土日祝の両方対応
平日のみ数えたい場合と、土日祝のみ数えたい場合があるとき、これらを組み合わせ
このような関数にすることで両方に対応できます。
//平日または土日祝をカウント
function days(input, weekday){
//今日を取得
let today = new Date();
//カウント
let count = 0;
//inputがtodayより大きい間、todayに+1していく
while(input >= today){
//todayに+1日
today.setDate(today.getDate() + 1);
//曜日を取得 0=日 6=土
let week = today.getDay();
//祝日かどうか (祝日なら祝日名が、じゃなければundefined)
let is_holiday = JapaneseHolidays.isHoliday(today);
//weekdayがtrueのときは平日をカウント
if(weekday){
//土日でも祝日でもないとき
if(week != 0 && week != 6 && !is_holiday){
++count;
}
}else{
//土日または祝日のとき
if(week == 0 || week == 6 || is_holiday){
++count;
}
}
}
return count;
}
days(new Date('2023-10-11'), true); // 平日のみカウントする場合
days(new Date('2023-10-11'), false); // 土日祝のみカウントする場合
過去にも対応するには
上記では「(未来の日付) は平日が何日間?」を数えましたが、過去にも対応するには、分岐させてwhile文をもう一つ作らなければなりません。 たぶん。
という訳で、過去にも対応したコードがこちら。
//平日をカウント
function weekdays(input){
let today = new Date();
let count = 0;
//入力された日にちが未来のとき
if(input - today > 0){
while(input >= today){
//todayに+1
today.setDate(today.getDate() + 1);
//曜日を取得 0=日 6=土
let week = today.getDay();
//祝日かどうか (祝日なら祝日名が、じゃなければundefined)
let is_holiday = JapaneseHolidays.isHoliday(today);
//土日でも祝日でもないとき
if(week != 0 && week != 6 && !is_holiday){
++count;
}
}
}else{
while(input <= today){
//todayに-1
today.setDate(today.getDate() - 1);
//曜日を取得 0=日 6=土
let week = today.getDay();
//祝日かどうか (祝日なら祝日名が、じゃなければundefined)
let is_holiday = JapaneseHolidays.isHoliday(today);
//土日でも祝日でもないとき
if(week != 0 && week != 6 && !is_holiday){
--count;
}
}
//マイナスのときは+1
++count;
}
return count;
}
weekdays(new Date('2023-10-01')); // -8 (今日が2023-10-11だとしたら)
weekdays(new Date('2023-10-21')); // 8 (今日が2023-10-11だとしたら)
このコードではinputが過去の場合、平日のカウントは -1 などと出ます。
こちらも、土日祝のみカウントするには、15行目と28行目のif文を、以下のように変更してください。
//土日または祝日のとき
if(week == 0 || week == 6 || is_holiday){
コメント
「できました!」などの報告もお待ちしております。