Javascript 从日期/时间小时计数中排除周末

Javascript 从日期/时间小时计数中排除周末,javascript,internet-explorer-8,Javascript,Internet Explorer 8,我有以下适合我需要的功能: function funLoad(str1,str3,str4) { var dym1 = str1.split("/"); var d=new Date(); var dym2 = d.getMonth() + 1 + "-" + d.getDate() + "-" + d.getFullYear() + " " + d.getHours() + ":" + d.getMinutes() + ":00"; //var dym2 =

我有以下适合我需要的功能:

function funLoad(str1,str3,str4)
{

    var dym1 = str1.split("/");

    var d=new Date();
    var dym2 = d.getMonth() + 1 + "-" + d.getDate() + "-" + d.getFullYear() + " " + d.getHours() + ":" + d.getMinutes() + ":00";
    //var dym2 = "6 10 2013 09:00:00";

    var start = Date.parse(dym1[1] + "-" + dym1[0] + "-" + dym1[2] + " " + str3 + ":" + str4 + ":00"); 
    var end = Date.parse(dym2);

    return (start-end) / (1000*60*60);

}

$("#btn1").click(function(event){
    alert(funLoad($("#txt1").val(),$("#ddlHourTime").val(),$("#ddlMinuteTime").val()));
});
下面是一个JSFIDLE:

我知道这可能只适用于IE8,但我正在开发一个每个人都只使用IE8的intranet环境,所以这不是一个问题。忽略这一点,该脚本只获取选定的日期和时间,将其与当前日期/时间进行比较,并返回小时数。到目前为止一切都很好


问题是周末也算在内。如果开始和结束日期包括周末,我如何只计算工作日的小时数而不包括周末?例如,如果开始日期是星期五,结束日期是星期一,它应该只计算星期五和星期一的小时数,不包括周末的48小时。

我在JSFIDLE中开发的这个函数应该满足您的要求。您将需要运行它的速度,以确保它正确计算所有内容

功能加载(str1、str3、str4){

var dym1=str1.split(“/”);
//获取给定的(开始)历元值(使用午夜作为时间-将根据下面的实际时间进行调整)
var start_date=新日期(dym1[2],(dym1[1]-1),dym1[0],0,0,0);
var start_epoch=start_date.getTime();
//获取今天(结束)的历元值(使用午夜作为时间-将根据下面的实际时间进行调整)
var end_d=新日期();
var end_epoch=新日期(end_d.getFullYear(),end_d.getMonth(),end_d.getDate(),0,0,0).getTime();
变量end_date_是_weekend=(end_d.getDay()==0 | | end_d.getDay()==6)?1:0;
//获取1天的值(毫秒)
var一天=1000*60*60*24;
//给定日期和今天日期之间有多少天
var总天数=数学ceil((结束纪元-开始纪元)/一天)-1;
//计算出这些总天数中有多少是周末
var日期到检查=开始纪元+一天;
var总周末天数=0;
var下一天为周末=0;
对于(变量x=0;x 30){
如果(str3==23&下一天是周末==0){
//四舍五入将开始日期设置为第二天的开始,因此减去
//总天数的一天,除非第二天是周末。
总周天数-=1;
开始日期中剩余的小时数=-24;
}否则{
开始日期的剩余小时数=24-(str3+1);
}
}否则{
开始日期的剩余小时数=24-标准时间3;
}    
总小时数+=开始日期剩余小时数;
//添加结束日期(今天日期)后的小时数,除非今天是周末
var小时数过去在结束日期=0;
var end_hour=end_d.getHours();
如果(结束日期为周末==0){
//四舍五入至下一个最近的结束日期小时
如果(end_d.getMinutes()>30){
如果(结束时间==23){
//集中起来就是一整天
过去的小时数在结束日期=24;
}否则{
//四舍五入只会增加一个小时
结束日期中的过去时间=结束时间+1;
}
}否则{
过去的小时数在结束日期=结束小时;
}
}
总小时数+=过去在结束日期的小时数;
$(“#result”).html(‘开始历元:’开始历元+’,结束历元:’结束历元+’,总天数“+总天数+”,总周末“+总周末天数+”,总周天数:‘+总周天数+’,开始日期剩余小时数:‘+开始日期剩余小时数+’,结束日期过去小时数:‘+结束日期过去小时数+’,总小时数:‘);
}

这将起作用:

var calcWorkHours = function calcWorkHours(start, end) {
        var total = (end - start) / (1000 * 60 * 60 * 24),  // compute difference in days
            totalDays = parseInt(total, 10),                // trim fractional portion
            remainder = (total - totalDays) * 24,           // save fractional portion in hours
            startingDay = start.getDay(),                   // starting weekday
            endingDay = end.getDay(),                       // ending weekday
            possibleWorkingDays = (totalDays * 5),
            actualOccurringWeekends = (startingDay - endingDay) * 2,
            workDays = (possibleWorkingDays - actualOccurringWeekends) / 7;
        if (endingDay === 6) {
            workDays -= 1;  // ends on a weekend, subtract a day
        }
        if (startingDay === 0) {
            workDays -= 1;  // starts on a weekend, subtract a day
        }
        return (workDays * 24) + remainder; // convert to hours and add back fractional portion
    },
    parseInputs = function parseInputs(date, hour, minute) {
        var dmy = date.split("/"),
            now = new Date(),
            thisMinute = now.getMonth() + 1 + "-" + now.getDate() + "-" + now.getFullYear() + " " + now.getHours() + ":" + now.getMinutes() + ":00",
            start = Date.parse(dmy[1] + "-" + dmy[0] + "-" + dmy[2] + " " + hour + ":" + minute + ":00"),
            end = Date.parse(thisMinute);
        start = new Date(start);
        end = new Date(end);
        return calcWorkHours(start, end);
    };
请在此处查看它的实际操作:

更新

如果您确实需要以负数表示的小时数,只需切换
calcWorkHours
中的参数即可:

return calcWorkHours(end, start);

第一个JSFIDLE链接出现了一些糟糕的情况。只是把它更新到了正确的位置。对此很抱歉。请注意,假设夏令时在使用的时区内有效,并非每天都是24小时(因为我们在这里专门讨论周末,一年中有两个周六是有问题的)。就我所能看到的快速看,没有一个答案到目前为止解释这一点。
return calcWorkHours(end, start);