Здравствуйте!
Помогите пожалуйста составить код для вычисления между двумя датами количество выходных (субота, воскресение).
Заранее спасибо!
function Calculate( endDay, startDay, holidaysData, changedHolidaysData, workdayCount ) {
function FormatDate( d ) {
return d.getDate( ) + '.' + ( d.getMonth( ) + 1 ) + '.' + d.getFullYear( );
}
function IsHoliday( date ) {
return date.getDay( ) == 0 || date.getDay( ) == 6;
}
function IsYesterday( d, d1 ) {
if ( ! d ) {
return false;
}
var d2 = new Date( d1.getFullYear( ), d1.getMonth( ), d1.getDate( ) - 1 );
return d2.getDate( ) == d.getDate( ) && d2.getMonth( ) == d.getMonth( ) && d2.getFullYear( ) == d.getFullYear( );
}
function IsSameDay( d1, d2 ) {
return d1.getFullYear( ) == d2.getFullYear( ) && d1.getMonth( ) == d2.getMonth( ) && d1.getDate( ) == d2.getDate( );
}
function IsHolidayEx( d ) {
var isH = IsHoliday( d );
for ( var h = 0;
h < changedHolidaysData.length;
++ h ) {
var holiday = changedHolidaysData[ h ];
var dateCheck = String2Date( isH ? holiday.dateFrom : holiday.dateTo );
if ( dateCheck.getMonth( ) == d.getMonth( ) && dateCheck.getDate( ) == d.getDate( ) && dateCheck.getFullYear( ) == d.getFullYear( ) ) {
return ! isH;
}
}
return isH;
}
var startDate = startDay.getTime( ) <= endDay.getTime( ) ? startDay : endDay;
var endDate = startDay.getTime( ) <= endDay.getTime( ) ? endDay : startDay;
var startyear = startDate.getFullYear( );
var endyear = endDate.getFullYear( );
var holidays = new Array( );
var workdays = new Array( );
for ( var y = startyear;
y <= endyear;
++ y )GetYearData( y );
function GetYearData( year ) {
var transfers = [ ];
var lastHoliday = 0;
var sequence = 0;
for ( var m = 0;
m < 12;
++ m ) {
for ( var d = 1;
d < 32;
++ d ) {
var date = new Date( year, m, d );
if ( date.getMonth( ) != m ) {
continue;
}
var isH = false;
for ( var h = 0;
h < holidaysData.length;
++ h ) {
var holiday = holidaysData[ h ];
var startDate = String2Date( holiday.startDate );
var endDate = String2Date( holiday.endDate );
if ( m >= startDate.getMonth( ) && d >= startDate.getDate( ) && m <= endDate.getMonth( ) && d <= endDate.getDate( ) ) {
isH = true;
if ( IsHolidayEx( date ) ) {
transfers.push( date );
}
}
}
if ( ! isH && IsYesterday( lastHoliday, date ) ) {
if ( IsHoliday( date ) ) {
isH = true
} else if ( transfers.length ) {
var transferDate = transfers.shift( );
isH = true;
}
}
for ( var h = 0;
h < changedHolidaysData.length;
++ h ) {
var holiday = changedHolidaysData[ h ];
var dateTo = String2Date( holiday.dateTo );
if ( dateTo.getMonth( ) == m && dateTo.getDate( ) == d && dateTo.getFullYear( ) == year ) {
isH = true;
}
}
if ( isH ) {
holidays.push( date );
lastHoliday = date;
}
if ( IsYesterday( lastHoliday, date ) ) {
lastHoliday = 0;
}
}
}
for ( var h = 0;
h < changedHolidaysData.length;
++ h ) {
var workday = changedHolidaysData[ h ];
var dateFrom = String2Date( workday.dateFrom );
if ( dateFrom.getFullYear( ) == year ) {
workdays.push( dateFrom );
}
}
}
function IsStateHoliday( d ) {
for ( var i in holidays ) {
if ( IsSameDay( d, holidays[ i ] ) ) return true;
}
return false;
}
function IsTransferredWorkday( d ) {
for ( var i in workdays ) {
if ( IsSameDay( d, workdays[ i ] ) ) return true;
}
return false;
}
var counteddays = 0;
var next = new Date( startDate.getFullYear( ), startDate.getMonth( ), startDate.getDate( ) );
while ( next.getTime( ) < endDate.getTime( ) ) {
if ( IsTransferredWorkday( next ) )counteddays ++; else if ( IsStateHoliday( next ) ); else if ( IsHolidayEx( next ) ); else counteddays ++;
next = new Date( next.getFullYear( ), next.getMonth( ), next.getDate( ) + 1 );
}
workdayCount.SetValue( counteddays );
}