Jumlah hari diantara dua tanggal


Tulisan ini adalah jawaban dari pertanyaan Restu Herwanto dari tulisan jQuery UI datepicker, disable hari libur, menghitung jumlah hari diantara dua tanggal dengan mengeluarkan hari sabtu dan minggu dari perhitungan tersebut.


Yang kita perlukan dari function ini adalah tanggal mulai (start date) dan tanggal selesai (end date), dengan argument opsional array hari libur dan array hari yang dikeluarkan dari perhitungan (jika ingin mendefinisikan hari lain yang dikeluarkan dari perhitungan selain default hari sabtu dan minggu.

function countDays(start, end /* [, holiday [, excludeDays]]  */) {
	
	// 3rd argument is array of holiday
	if (arguments.length >= 3) {
		var holiday = arguments[2];
		
		// convert to timestamp
		holiday = holiday.map( function(value, index, array) {
			return value.getTime();
		});		
	}
	else {
		var holiday = [];
	}
	
	// 4th argument is array of exclude days, default are Sunday and Saturday 
	if (arguments.length >= 4) {
		var excludeDays = arguments[3];
	}
	else {
		var excludeDays = [
			0,		// Sunday 
			6		// Saturday
		];
	}
	
	// milisecond per day
	var oneDay = 1000 * 24 * 60 *60;
	
	// different of start and end day
	var diff = Math.ceil((end.getTime() - start.getTime()) / oneDay);
	
	// count days
	var days = 0;
	for (var i = 0; i <= diff; i++) {
		
		// current date
		var now = new Date(start.getFullYear(), start.getMonth(), start.getDate() + i);
		
		// flag count the day or not
		var isCount = true;
		
		// exclude holiday
		if (holiday.indexOf(now.getTime()) > -1) {
			isCount = false;
		}
		
		// exclude days
		if (excludeDays.indexOf(now.getDay()) > -1) {
			isCount = false;
		}
		
		if (isCount) {
			days++;
		}
		
	}
	
	return days;
	
}

Untuk testing kita menggunakan tanggal 22 Oktober 2012 dan tanggal 31 Oktober 2012, diantara tanggal tersebut ada tanggal 26 Oktober 2012 yang merupakan hari libur nasional Idul Adha 1433 H

var start = new Date(2012, 9, 22);		// 22 oct 2012
var end = new Date(2012, 9, 31);		// 31 oct 2012

var holiday = [
	new Date(2012, 9, 26)	// Idul Adha 1433 H
];

var excludeDays = [1, 2, 3];	// monday, tuesday, wednesday

// normal
var days = countDays(start, end);
console.log(days);

// exclude holiday
var days = countDays(start, end, holiday);
console.log(days);

// exclude holiday and defined day
var days = countDays(start, end, holiday, excludeDays);
console.log(days);

catatan: untuk menggunakan function countDays di atas, browser harus support Array.prototype.map() dan Array indexOf method

live demo

Tinggalkan komentar