查找两个日期之间的差异(周末除外)

cyb*_*fly 17 javascript jquery-ui

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

现在问题是我想从计算中排除周末天数(星期六和星期日).我该怎么做?

例如,用户选择开始日期(13/8/2010)和结束日期(16/8/2010).自2010年8月14日和2010年8月15日是在工作日,而不是总共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>
Run Code Online (Sandbox Code Playgroud)

Gar*_*ero 20

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

在原始的JavaScript中我将使用:

现场演示

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));
Run Code Online (Sandbox Code Playgroud)

这里找到

并调用该函数,例如:

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);
  }
});
Run Code Online (Sandbox Code Playgroud)

##编辑##

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

您的代码将如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)

  • 它给出了错误的结果.如果您选择开始日期"06-11-2015"和结束日期"06-18-2015"..它的结果为1.它应该是5 (3认同)
  • +1用于发布对原始代码的引用!当我最初查看帖子时,我实际上没有看到.+1也是因为代码比我的解决方案快,但不是很多:) (2认同)
  • @GarisMSuero calcBusinessDays它不适用于任何两个日期,请尝试使用'20140328'和'20140404'; 结果为0,这是错误的; 这是因为UTC偏移; 请查看这篇文章,Michael Liu的回答:http://stackoverflow.com/questions/542938/how-do-i-get-the-number-of-days-between-two-dates-in-javascript (2认同)
  • 此脚本无法正常运行.它显示了在星期天开始并在星期五结束前的1天.[在这里复制虫子](http://jsfiddle.net/e6gmkLwg/) (2认同)

小智 12

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

它并不复杂,看起来有一些明显的假设:

  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);
}


var date1 = new Date(1999, 12, 31);
var date2 = new Date(); // now

print( getBusinessDateCount(date1, date2) );
Run Code Online (Sandbox Code Playgroud)

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

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

希望能帮助到你...

好编码!!


sbe*_*rry 9

我就是这样做的

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"));
Run Code Online (Sandbox Code Playgroud)

编辑
澄清我对@keenebec的评论...
该解决方案将很好地适用于小日期差异,并且易于理解.但是在6年的时间里采取"短暂"的东西,你可以看到速度上的显着差异.

http://jsfiddle.net/aSvxv/

我包括所有3个答案,原始答案确实是最快的,但不是很多,并且对于我来说,执行几微秒的执行对于可读性来说有点微不足道.