2012-03-08 2 views
1

Я пытаюсь сделать 2 вещи.Рассчитать рабочие дни в месяц с Javascript

  1. Рассчитать количество рабочих дней до даты в данном месяце на основе текущего дня (т.е. сегодня 7 марта 2012 Таким образом, за 5 рабочих дней прошло)
  2. Рассчитать количество рабочих дней, чтобы перейти в данный месяц на основе текущего дня (т.е. Сегодня 7 марта 2012 поэтому, есть 17 рабочих дней осталось в этом месяце

Любая помощь здесь была бы оценена

EDIT:.. Это то, что я до сих пор пытался:

function isWeekday(year, month, day) {var day = new Date(year, month, day).getDay();return day !=0 && day !=6;} 
function getWeekdaysInMonth(month, year) {var days = daysInMonth(month, year);var weekdays = 0;for(var i=0; i< days; i++) {if (isWeekday(year, month, i+1)) weekdays++;}return weekdays;} 
function calcBusinessDays(dDate1, dDate2) { 
    var iWeeks, iDateDiff, iAdjust = 0; 
    if (dDate2 < dDate1) return -1;     // error code if dates transposed 
    var iWeekday1 = dDate1.getDay();    // day of week 
    var iWeekday2 = dDate2.getDay(); 
    iWeekday1 = (iWeekday1 == 0) ? 7 : iWeekday1; // change Sunday from 0 to 7 
    iWeekday2 = (iWeekday2 == 0) ? 7 : iWeekday2; 
    if ((iWeekday1 > 5) && (iWeekday2 > 5)) iAdjust = 1; // adjustment if both days on weekend 
    iWeekday1 = (iWeekday1 > 5) ? 5 : iWeekday1; // only count weekdays 
    iWeekday2 = (iWeekday2 > 5) ? 5 : iWeekday2; 
    // calculate differnece in weeks (1000mS * 60sec * 60min * 24hrs * 7 days = 604800000) 
    iWeeks = Math.floor((dDate2.getTime() - dDate1.getTime())/604800000) 
    if (iWeekday1 <= iWeekday2) { 
    iDateDiff = (iWeeks * 5) + (iWeekday2 - iWeekday1) 
    } else { 
    iDateDiff = ((iWeeks + 1) * 5) - (iWeekday1 - iWeekday2) 
    } 
    iDateDiff -= iAdjust       // take into account both days on weekend 
    return (iDateDiff + 1);       // add 1 because dates are inclusive 
} 

Не совсем уверен, как собрать все вместе, чтобы получить рабочие дни и рабочие дни.

+1

Что вы пробовали? Что конкретно о вашем попытке решения дает вам проблемы? – maerics

+0

Хотите также учесть праздники? –

+0

Maerics Я обновил свой запрос выше. Яков, праздники не важны. – st4ck0v3rfl0w

ответ

1

Вот действительно простая функция, которая просто петляет над днями, должна быть достаточно быстрой, так как она никогда не должна зацикливаться более 31 раза. Если текущий день является рабочим днем, он засчитывается в минувшие дни:

function businessDays(date) { 

    // Copy date 
    var t = new Date(date); 
    // Remember the month number 
    var m = date.getMonth(); 
    var d = date.getDate(); 
    var daysPast = 0, daysToGo = 0; 
    var day; 

    // Count past days 
    while (t.getMonth() == m) { 
    day = t.getDay(); 
    daysPast += (day == 0 || day == 6)? 0 : 1; 
    t.setDate(--d); 
    } 

    // Reset and count days to come 
    t = new Date(date); 
    t.setDate(t.getDate() + 1); 
    d = t.getDate(); 

    while (t.getMonth() == m) { 
    day = t.getDay(); 
    daysToGo += (day == 0 || day == 6)? 0 : 1; 
    t.setDate(++d); 
    } 
    return [daysPast, daysToGo]; 
} 

alert(businessDays(new Date(2012,2,7))); // 7-Mar-2012 => 5, 17 
Смежные вопросы