【问题标题】:weekend, holidays count between two dates without iteration周末,假期在两个日期之间计算,无需迭代
【发布时间】:2014-01-28 18:31:30
【问题描述】:

我必须计算以下两个日期之间的周末计数和假期计数。

var startDate = new Date("01/02/2014");
        var endDate = new Date("02/06/2014");
        var holidays = [new Date("01/06/2014"), new Date("01/26/2014")];

【问题讨论】:

  • 那么你的问题是什么?
  • 查看 Momentjs (momentjs.com) 或 Sugarjs (sugarjs.com/dates)
  • 没有迭代,你的意思是不从startDate迭代到endDate?
  • 我已经检查了这一刻,但我无法绑定这个周末计数计算的逻辑
  • 是的 Mr.J.Rahmati 是否可以在两个不同日期之间不进行迭代计算;

标签: javascript html date


【解决方案1】:

这会循环一周,因此最多有 6 次迭代。我想不出更优雅的方法来用纯 JS 解决这个问题。

var startDate = new Date("01/02/2014");
var endDate = new Date("02/06/2014");

var diff = Math.abs(startDate - endDate); // in milliseconds
var ms_per_day = 1000*60*60*24;
var days = diff/ms_per_day + 1; // convert to days and add 1 for inclusive date range
var mod = days % 7;
var full_weeks = (days - mod) / 7;

var weekend_days = full_weeks * 2;

if (mod != 0) { // iterate through remainder days
    var startPartialWeek = new Date();
    var endPartialWeek = endDate;
    startPartialWeek.setTime(endDate.getTime() - (mod - 1)*ms_per_day);
    for (var d = startPartialWeek; d <= endPartialWeek; d.setDate(d.getDate() + 1)) {
        if(d.getDay() == 0 || d.getDay() == 6) {
            weekend_days++;
        }
    }
}

alert(weekend_days);

这仅计算周六和周日,不包括节假日。如果不遍历从其他来源获得的假期日期集合,我认为您将无法度过假期。

【讨论】:

    【解决方案2】:

    具有以下两个功能:

    function calculateTotalDays(firstDate, secondDate){
        var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds
        var firstDate = new Date(2008,01,12);
        var secondDate = new Date(2008,01,22);
    
        var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
        return diffDays;
    }
    
    function calcBusinessDays(dDate1, dDate2) { // input given as Date objects
        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
    }
    

    您可以按如下方式计算总周末数:

    var startDate = new Date("01/02/2014");
    var endDate = new Date("02/06/2014");
    var totalDays = calculateTotalDays(startDate, endDate);
    var weekendDays = totalDays - calcBusinessDays(startDate, endDate);
    

    然后计算 start 和 endDate 之间的假期:

    var totalHolidays = 0;
    for (var i = 0, i < holidays.length; i++){
      var d = holidays[i].getDay();//Make sure holiday is not a weekendday!
      if (holidays[i] >= startDate && holidays[i] <= endDate && !(d == 0 || d==6))
        totalHolidays++;
    }
    

    【讨论】:

    • 作为附加信息 calcBusinessDays 是来自这个page 的函数!不是我自己写的!
    • 如果开始日是“星期日”而结束日是“星期五”,则会失败。它只计算 1 天。例如,从 2015 年 1 月 18 日到 2015 年 1 月 23 日。Here's the reproduction of the bug
    【解决方案3】:
    // Count days between the 2 dates
    var days = Math.floor(((Date.UTC(endDate.getFullYear(), endDate.getMonth(), endDate.getDate())
      - Date.UTC(startDate.getFullYear(), startDate.getMonth(), startDate.getDate())) / (24 * 60 * 60 * 1000)));
    
    // Count holidays
    var countHolidays = 0;
    for (var i = 0, len = holidays.length; i < len; ++i)
      if (holidays[i] >= startDate && holidays[i] <= endDate)
        ++countHolidays;
    
    // Vars used to count sundays and saturdays
    var adjustingDays1 = (7 - startDate.getDay()) % 7, // days between week of startDate and sunday
        adjustingDays2 = (7 + 6 - startDate.getDay()) % 7, // days between week of startDate and saturday
        oddDays = days % 7; // remainder of total days after dividing 7
        completeWeeks = Math.floor(days / 7);
    
    // Count weekend days
    var countWeekEndDays = completeWeeks + (oddDays >= adjustingDays1 ? 1 : 0) +
               completeWeeks + (oddDays >= adjustingDays2 ? 1 : 0);
    
    console.log('holidays: ' + countHolidays);
    console.log('weekend days: ' + countWeekEndDays);
    

    【讨论】:

    • 这可以返回countWeekEndDays 的非整数值。示例:Date("2013/12/29")Date("2014/01/21")
    猜你喜欢
    • 2011-04-17
    • 1970-01-01
    • 2020-08-21
    • 2017-01-28
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2019-04-15
    相关资源
    最近更新 更多