フロントの人の雑多メモ

JSで土日祝を除いた日数または土日祝のみをカウントする方法

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

ここで、祝日を判定するために、こちらのライブラリをお借りしています。

japanese-holidays-js

このようにすると、祝日の場合、変数「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){

コメント

「できました!」などの報告もお待ちしております。

内容を確認の上、個人情報などは省いて掲載させていただきます。

直接送信されます。確認の上、「送信」してください。

シェア

Twitterでシェア Facebookでシェア LINEでシェア はてなブックマークでシェア