查找两个日期之间的天差(不包括周末)

IT技术 javascript jquery-ui
2021-01-19 17:48:44

嗨,我正在使用 jquery-ui datepicker选择日期和date.js来查找 2 个日期之间的差异。

现在的问题是我想从计算中排除周末(周六和周日)。我该怎么做?

例如,用户选择开始日期 (13/8/2010) 和结束日期 (16/8/2010)。由于 14/8/2010 和 15/8/2010 是工作日,而不是总共 4 天,我希望它只有 2 天。

这是我现在使用的代码:

<script type="text/javascript">

    $("#startdate, #enddate").change(function() {       

    var d1 = $("#startdate").val();
    var d2 = $("#enddate").val();

            var minutes = 1000*60;
            var hours = minutes*60;
            var day = hours*24;

            var startdate1 = getDateFromFormat(d1, "d-m-y");
            var enddate1 = getDateFromFormat(d2, "d-m-y");

            var days = 1 + Math.round((enddate1 - startdate1)/day);             

    if(days>0)
    { $("#noofdays").val(days);}
    else
    { $("#noofdays").val(0);}


    });

    </script>
6个回答

也许其他人可以帮助您将此功能转换为 JQuery 的框架...

我在这里找到了这个功能

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) { //Equal to makes it reduce 5 days
    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 date1 = new Date("August 11, 2010 11:13:00");
var date2 = new Date("August 16, 2010 11:13:00");
alert(calcBusinessDays(date1, date2));

##已编辑##

如果您想将它与您的格式一起使用:

您的代码将如下所示:

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) { //Equal to makes it reduce 5 days
    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
}


$("#startdate, #enddate").change(function() {

  var d1 = $("#startdate").val();
  var d2 = $("#enddate").val();

  var minutes = 1000 * 60;
  var hours = minutes * 60;
  var day = hours * 24;

  var startdate1 = new Date(d1);
  var enddate1 = new Date(d2);


  var newstartdate = new Date();
  newstartdate.setFullYear(startdate1.getYear(), startdate1.getMonth(), startdate1.getDay());
  var newenddate = new Date();
  newenddate.setFullYear(enddate1.getYear(), enddate1.getMonth(), enddate1.getDay());
  var days = calcBusinessDays(newstartdate, newenddate);
  if (days > 0) {
    $("#noofdays").val(days);
  } else {
    $("#noofdays").val(0);
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<label>Start Date
 <input type="date" id="startdate" value="2019-03-03"/>
</label>

<label>End Date
 <input type="date" id="enddate" value="2019-03-06"/>
</label>

<label>N. of days
 <output id="noofdays"/>
</label>

它给出了错误的结果。如果您选择开始日期“06-11-2015”和结束日期“06-18-2015”..它给出的结果为 1。它应该是 5
2021-03-27 17:48:44
+1 用于发布对原始代码的引用!其实我当初看帖子的时候没看到。+1 也是因为代码比我的解决方案快,但不是很多:)
2021-03-29 17:48:44
@GarisMSuero calcBusinessDays 它不适用于任何两个日期,请尝试使用“20140328”和“20140404”;结果是0,这是错误的;发生这种情况是因为 UTC 偏移;请查看这篇文章,Michael Liu 的回答:stackoverflow.com/questions/542938/...
2021-04-02 17:48:44
此脚本无法正常工作。从星期日开始到星期五结束时,它显示 1 天。在这里重现错误
2021-04-02 17:48:44
谢谢我得到它的工作虽然代码有点不同。无论如何,非常感谢您的帮助。我被这个问题困扰了 2 天,直到我找到了 stackoverflow 和你的巨大帮助。
2021-04-08 17:48:44

为此,您不应搜索这些日期之间的所有天数!

并不复杂,看一些明显的假设:

  1. 所有整周都有 7 天。

  2. 其中 2 天是周末。

  3. 其中 5 个是工作日。

明显的结论:

  1. 看所有的日子都是在浪费时间。

  2. 检查哪一天是周末到整个星期都在浪费时间。


没有繁琐的解释..让我展示代码:

function getBusinessDateCount (startDate, endDate) {
    var elapsed, daysBeforeFirstSaturday, daysAfterLastSunday;
    var ifThen = function (a, b, c) {
        return a == b ? c : a;
    };

    elapsed = endDate - startDate;
    elapsed /= 86400000;

    daysBeforeFirstSunday = (7 - startDate.getDay()) % 7;
    daysAfterLastSunday = endDate.getDay();

    elapsed -= (daysBeforeFirstSunday + daysAfterLastSunday);
    elapsed = (elapsed / 7) * 5;
    elapsed += ifThen(daysBeforeFirstSunday - 1, -1, 0) + ifThen(daysAfterLastSunday, 6, 5);

    return Math.ceil(elapsed);
}

function calc() {
  let start = document.querySelector('#startDate').value,
      end = document.querySelector('#endDate').value,
      result = getBusinessDateCount(new Date(start), new Date(end));
  document.querySelector('#result').value = result;
}
Start date: <input type="date" id="startDate" value="2020-01-04"><br>
End date: <input type="date" id="endDate" value="2020-01-06"><br>
<input type="button" onclick="calc()" value="Get business days"><br>
Business days: <input id="result" readonly>

您可以使用任何日期自行测试。

我只是想注意到这段代码在 2000 年到 2015 年的日期之间只消耗了 0.43 秒......它比其他一些代码快得多。

希望能帮助到你...

不错的编码!!

在周末开始时,它不会正确计数重现错误当它应该是 5 时,它的计数是 3 天。
2021-03-19 17:48:44
@阿尔瓦罗。非常感谢您的回复..我已经更新了功能..检查它现在是否适合您
2021-03-26 17:48:44
非常感谢它,它现在似乎可以正常工作了!
2021-03-29 17:48:44

这就是我要做的

function getDays(d1, d2) {
    var one_day=1000*60*60*24;
    var d1_days = parseInt(d1.getTime()/one_day) - 1;
    var d2_days = parseInt(d2.getTime()/one_day);
    var days = (d2_days - d1_days);
    var weeks = (d2_days - d1_days) / 7;
    var day1 = d1.getDay();
    var day2 = d2.getDay();
    if (day1 == 0) {
        days--;
    } else if (day1 == 6) {
        days-=2;
    }
    if (day2 == 0) {
       days-=2;
    } else if (day2 == 6) {
       days--;
    }
    days -= parseInt(weeks) * 2;
    alert(days);
}

getDays(new Date("June 8, 2004"),new Date("February 6, 2010"));

编辑
为了澄清我对@keenebec 的评论......
该解决方案将很好地适用于小日期差异,并且易于理解。但是将一些“短”的东西作为 6 年的跨度,您会看到速度的显着差异。

http://jsfiddle.net/aSvxv/

我包含了所有 3 个答案,原始答案确实是最快的,但速度并不快,而且为了提高可读性,几微秒的执行权衡对我来说有些微不足道。

这应该是公认的答案。Garis 的那个有周末开始和结束的错误Garis bug 的再现
2021-03-21 17:48:44
从今天开始并在星期一结束时失败。重现错误3个工作日,上报5个。
2021-03-23 17:48:44
修复第 2 天小于第 1 天的错误: if (day2 < day1) weeks++;
2021-03-26 17:48:44
这是一篇旧帖子,但想知道是否有任何方法可以修改它以考虑时间并提供天数差异作为分数 - 例如:2 个时间戳之间的差异是 2.35 天后不包括周末
2021-04-10 17:48:44

Date.prototype.addDays = function(days) {
    var date = new Date(this.valueOf())
    date.setDate(date.getDate() + days);
    return date;
}

function getBusinessDatesCount(startDate, endDate) {
    var count = 0;
    var curDate = startDate;
    while (curDate <= endDate) {
        var dayOfWeek = curDate.getDay();
        var isWeekend = (dayOfWeek == 6) || (dayOfWeek == 0); 
        if(!isWeekend)
           count++;
        curDate = curDate.addDays(1);
    }
    return count;
}



//Usage
var startDate = new Date('7/16/2015');
var endDate = new Date('7/20/2015');
var numOfDays = getBusinessDatesCount(startDate,endDate);
jQuery('div#result').text(numOfDays);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"/>

理解方式。,


  1. 实际天数 = 14
  2. 实际天数的周数 = 14/7=2
  3. 每周周末=2
  4. 周末总数=2*周数

所以应用这个,

 $('#EndDate').on('change', function () {
            var start = $('#StartDate').datepicker('getDate');
            var end = $('#EndDate').datepicker('getDate');
            if (start < end) {
                var days = (end - start) / 1000 / 60 / 60 / 24;

                var Weeks=Math.round(days)/7;

                var totalWeekends=Math.round(Weeks)*2;

                var puredays=Math.round(days)-totalWeekends;

                $('#days').text(Math.round(puredays) + "Working Days");


            }
            else {
alert("");
}

谢谢 !

那么你需要设置计算来找出:总天数/ 7 = 周休息天数。
2021-03-24 17:48:44
如果我想得到像 { week1: 3 个工作日,week2: 5 个工作日 ....} 这样的输出
2021-04-01 17:48:44