使用javascript和jQuery UI日期选择器获取工作日数

使用javascript和jQuery UI日期选择器获取工作日数,javascript,datepicker,Javascript,Datepicker,我有两个日期选择器,从中我可以计算一天的数量,而不必计算周六和周日。但是我想在星期五和星期六做这个。我尝试过一些不同的方法,但失败了。对于我来说,处理星期六和星期天之外的天数很容易,但对于星期五和星期六则不容易。下面是我的javascript代码- $(function() { $( "#startDate" ).datepicker({ onSelect: calculateDays}); }); $(function() { $( "

我有两个日期选择器,从中我可以计算一天的数量,而不必计算周六和周日。但是我想在星期五和星期六做这个。我尝试过一些不同的方法,但失败了。对于我来说,处理星期六和星期天之外的天数很容易,但对于星期五和星期六则不容易。下面是我的javascript代码-

$(function() {
    $( "#startDate" ).datepicker({
        onSelect: calculateDays});
    });

    $(function() {
        $( "#endDate" ).datepicker({
            onSelect: calculateDays});
        });

        function calculateDays(startDate, endDate) {
            var form = this.form

            var startDate = document.getElementById("startDate").value;
            var startDate = new Date(startDate);

            var endDate = document.getElementById("endDate").value;
            var endDate = new Date(endDate);

            startDate.setHours(0,0,0,1); // Start just after midnight
            endDate.setHours(23,59,59,999); // End just before midnight

            var oneDay = 24*60*60*1000;
            var diff = endDate - startDate; // Milliseconds between datetime objects
            var days = Math.ceil(diff / oneDay);

            var weeks = Math.floor(days / 7);
            var days = days - (weeks * 2);

            // Handle special cases
            var startDay = startDate.getDay();
            var endDay = endDate.getDay();

            // Remove weekend not previously removed.
            if (startDay - endDay > 1)
                days = days - 2;

            // Remove start day if span starts on Sunday but ends before Saturday
            if (startDay == 0 && endDay != 6)
                days = days - 1

            // Remove end day if span ends on Saturday but starts after Sunday
            if (endDay == 6 && startDay != 0)
                days = days - 1

            if (days)
                document.getElementById("result").innerHTML=days;
        }
我的HTML是:

<form id="dateDifference" style="width:200px;">
    <input name="startDate" id="startDate" value="" >
    <input name="endDate" id="endDate" value="" >
</form>
<span id="result"></span>

javascript日期方法,getDay()将返回0表示星期天,1表示星期一,等等

您应该能够使用日期对象并检查一周中的当前日期,并将其从5(星期五)和6(星期六)的计数中排除

其中
d0
d1
是开始和结束
Date
对象(具有相同的小时值)。

还有一种方法

for(var i = startDate ; i <= endDate ;i.setDate(i.getDate() + 1)){
            if( i.getDay() != 6 && i.getDay() != 0)
            {
                days = days + 1;
                }
            }

for(var i=startDate;i如果要计算一年中的工作日数:

const monthWorkDays = (year, month) => 
new Array(32 - new Date(year, month, 32).getDate())
    .fill(1)
    .filter(
        (id, index) =>
            [0, 6].indexOf(
                new Date(year, month, index + 1).getDay()) === -1
            ).length;

const yearWorkDays = (year) =>
new Array(12)
    .fill(1)
    .reduce((pv, cv, index) => pv + monthWorkDays(year, index), 0);

yearWorkDays(2017)

我知道。但我已经提到,计算没有周六和周日的天数很容易,因为周六的值最高(6)所以每次你计算从星期六开始的日差时,你会得到一个大于1的值,当日差小于一周(7天)时,你可以很容易地减去2天。但是,当我从星期五开始计算日期值为5时,这是非常困难的。很抱歉,英语不好。这段代码对我来说似乎有问题…取决于结束日期。函数calculateBizDays(sDate,eDate){var saturday=7;var sunday=1;sDate.setHours(23);//这应该是0,但服务器按小时关闭。sDate.setMinutes(0);sDate.getSeconds(0);eDate.setHours(0);//BPM休息一小时?为什么?eDate.setMinutes(59);eDate.getSeconds(59);var ndays=1+Math.round(((eDate.getTime()*1000)-sDate.getTime()/(24*3600*1000));var nsaturdays=Math.floor((ndays+sDate.getDay())/7);返回ndays-2*nsaturdays-(sDate.getDay())==星期天)-(eDate.getDay()==星期六);}我有一些问题(由于一些服务器日期问题),但我试图计算工作日(即不包括Sat和Sun),发现它根据结束日期给出了奇怪的结果。我所做的是用.setHours.ps设置d0和d1中的小时。忽略我乘以eDate.getTime()*1000,sDate.setHours应为0,而不是23,endHours应为23,而不是0。。lol@ppumkin在这种情况下,请参见我的C#解决方案:请注意,此方法跳过周六和周日。如果您希望从计算中排除特定日期,例如国家或银行假日,此方法将有所帮助。if语句可以在数组o中包含日期检查你自己打造的节日。
const monthWorkDays = (year, month) => 
new Array(32 - new Date(year, month, 32).getDate())
    .fill(1)
    .filter(
        (id, index) =>
            [0, 6].indexOf(
                new Date(year, month, index + 1).getDay()) === -1
            ).length;

const yearWorkDays = (year) =>
new Array(12)
    .fill(1)
    .reduce((pv, cv, index) => pv + monthWorkDays(year, index), 0);

yearWorkDays(2017)