js中的给出一个日期,然后给出一个天数,要计算过了这多天后的日期。其中得到的日期要排除星期六和星期天
js计算工作日期???
如:起始日期:2010/8/1
      工作了:10 天
    结束日期为:2010/8/14
如何用js实现???并且如果第一个日期是星期六或星期天又怎么解决!
急啊!!各位高手救命啊!我也 写了一个,但是有很多问题!

解决方案 »

  1.   

    <html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=big5"> 
    <title>假日?算</title> 
    <script language="javascript"> 
    //假日表 
    var holidays = new Array(); 
    holidays[holidays.length] = new Date("2009/10/06"); 
    holidays[holidays.length] = new Date("2009/10/10"); function getWorkDays(){ 
    var dd = document.getElementById("days"); 
    var startDate=document.getElementById("dateFrom").value; 
    var obj= new Array(); //定?一?? 
    var obj= startDate.split("-");   
    var startDate1=obj[0]+"/"+obj[1]+"/"+obj[2]; 
    var endDate =document.getElementById("dateTo").value; 
    var objEnd= new Array(); //定?一?? 
    var objEnd = endDate.split("-");  
    var endDate1=objEnd[0]+"/"+objEnd[1]+"/"+objEnd[2]; dd.value=calculateWorkDays(startDate1,endDate1,holidays); 
    } function calculateWorkDays(fromStr, toStr,holidayArray){ 
    var from = new Date(); 
    var to = new Date(); 
    var fromTime = Date.parse(fromStr); 
    var toTime = Date.parse(toStr); 
    from.setTime(fromTime); 
    from.setHours(0); 
    from.setMinutes(0); 
    from.setSeconds(0); 
    var orgTime = from.getTime(); to.setTime(toTime); 
    to.setHours(0); 
    to.setMinutes(0); 
    to.setSeconds(0); if(from.getTime() > to.getTime()){ 
    return 0; 

    //把起始日都修正到星期六 javascript的星期?0?始,所以+1??理 
    var sDayofWeek = from.getDay()+1; 
    var workdays=0; if(sDayofWeek > 1 && sDayofWeek < 7) 

       from.setDate(from.getDate()-(sDayofWeek%7)); 
       workdays-=((sDayofWeek-2)>0)?sDayofWeek-2:0; 

    //?算??日期之?的天? var totalDays = (to.getTime()-from.getTime())/(1000*60*60*24)+1; 
    workdays+=Math.floor(totalDays/7)*5; //修正最后剩余天? 
    if((totalDays%7-2)>0){ 
    workdays+=(totalDays%7-2); 
    } if(holidayArray!=null){ 
    for(var i=0;i<holidayArray.length;i++){ 
    if(holidayArray[i].getTime()>orgTime && holidayArray[i].getTime()<to.getTime()){ 
    if(holidayArray[i].getDay()>0 && holidayArray[i].getDay()<6){ 
    workdays--; 



    } return workdays; 
    } </script> 
    </head> 
    <body> 
    <form> 
    ?<input type="text" id="dateFrom" name="fromDate" value="2009-08-06" size="10"> 
    到<input type="text" id="dateTo" name="toDate" value="2009-08-07" size="10"> 
    有<input type="text" id="days" name="days" value="" size="5">?工作日 
    <input type="button" name="BT" value="?算工作日" onclick="getWorkDays()"> 
    </form> 
    </body> 
    </html> 
      

  2.   

    http://fuanyu.javaeye.com/blog/450007这个给你做参考。
      

  3.   


    function f1(date, days){
        var dateVal = date.getTime();
        var oneDayVal = 24*60*60*1000;
        var newDateVal = dateVal;
        for(var i = 0 ; i < days; i++){
            var newDay = new Date(newDateVal).getDay();
            if(newDay == 0 || newDay == 6){
                days++;
            }
            newDateVal += oneDayVal;
        }
        return new Date(newDateVal);
    }
    var startDate = new Date(2010,7,1);
    alert(f1(startDate, 10));
      

  4.   


    <script type="text/javascript">
    var start = "2010-8-1", day = 10, s = 24 * 60 * 60 * 1000, w;
    var date = new Date(start.replace(/-/g, "/"));
    while(day > 0){
    w = date.getDay();
    if(w > 0 && w < 6){
    day--;
    }
    date.setTime(date.getTime() + s);
    }
    alert(date.toLocaleString());
    </script>
      

  5.   

    仔细看看 Date对象的API
    仔细看了还写不出 在急不迟
      

  6.   

    无论是 for 还是 while 都是循环的思路,
    循环是最容易想到的思路,但也是效率最差的解法,
    当 days 变大且反复调用时,效率问题就很明显了!非循环算法如下,workingDays = 1000000 与 workingDays = 100 是一样的!L@_@K <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>javascript.Date.CalculateDepartureDate.html</title>
        <meta name="generator" content="editplus" />
        <meta name="author" content="[email protected]" />
        <meta name="keywords" content="" />
        <meta name="description" content="" />
    </head>
    <body>
    <script type="text/javascript">
    <!--
    /*
    需求描述:给定任意日期作为入职日期,工作N个工作日之后,计算离职日期?
    注:
        “工作日”为周一至周五,不包含周六、日。
        “首个工作日”从注册日期之后算起,即不包含注册日期在内。
        “离职日期”为最后一个工作日的后一天。如:
        入职日期:2010/8/1
        工作天数:10
        离职日期:2010/8/14
    */// 入职日期
    var entryDate = ParseDate("2010/8/1");
    // 工作天数
    var workingDays = 10;
    // 离职日期
    var departureDate = GetDepartureDate(entryDate, workingDays);document.write(GetDateString(departureDate));function GetDepartureDate(entryDate, workingDays) {
        // 每周工作天数。
        var workingDaysPerWeek = 5;
        // 离职日期
        var departureDate = null;
        // 首个工作日
        var firstWorkingDate = GetFirstWokingDate(entryDate);
        // 周末跨度数
        var weekendSpan = 0;
        // 第一周工作天数。
        var firstWeekWorkingDays = 0;
        // 最后一周工作天数。
        var lastWeekWorkingDays = 0;
        // 从首个工作日之后,到离职日期之间持续的天数(包括离职日期在内)。
        var continuedDaysAfterFirstWorkingDate = 0;    if (IsMonday(firstWorkingDate)) {
            continuedDaysAfterFirstWorkingDate = GetContinuedDays(workingDays, workingDaysPerWeek, weekendSpan);
        } else {
            firstWeekWorkingDays = workingDaysPerWeek - firstWorkingDate.getDay() + 1;
            if (firstWeekWorkingDays >= workingDays) {
                continuedDaysAfterFirstWorkingDate = workingDays;
            } else {
                weekendSpan += 1;
                workingDays -= firstWeekWorkingDays;
                continuedDaysAfterFirstWorkingDate = firstWeekWorkingDays + GetContinuedDays(workingDays, workingDaysPerWeek, weekendSpan);
            }
        }
        departureDate = GetDateAfterGivenDate(firstWorkingDate, continuedDaysAfterFirstWorkingDate);    return departureDate;
    }
    function ParseDate(yyyyMMddString) {
        return new Date(Date.parse(yyyyMMddString));
    }
    function GetFirstWokingDate(entryDate) {
        var firstWorkingDate = GetNextDate(entryDate);    while (!IsWorkingDate(firstWorkingDate)) {
            firstWorkingDate = GetNextDate(firstWorkingDate);
        }
        return firstWorkingDate;
    }
    function IsWorkingDate(givenDate) {
        var givenWeekday = givenDate.getDay();
        return (givenWeekday >= 1 && givenWeekday <= 5)
    }
    function GetNextDate(givenDate) {
        var millisecondsPerDay = 86400000;
        return new Date(givenDate.valueOf() + millisecondsPerDay);
    }
    function GetDateString(givenDate) {
        var dateString = "";
        dateString += givenDate.getYear() + "/";
        dateString += (givenDate.getMonth() + 1) + "/";
        dateString += givenDate.getDate();
        return dateString;
    }
    function IsMonday(givenDate) {
        return givenDate.getDay() == 1;
    }
    function GetDateAfterGivenDate(givenDate, continuedDays) {
        var millisecondsPerDay = 86400000;
        return new Date(givenDate.valueOf() + (millisecondsPerDay * continuedDays));
    }
    function GetContinuedDays(workingDays, workingDaysPerWeek, weekendSpan) {
        // 周末天数。
        var daysPerWeekend = 2;
        weekendSpan += Math.floor(workingDays / workingDaysPerWeek);
        var lastWeekWorkingDays = workingDays % workingDaysPerWeek;
        if (lastWeekWorkingDays == 0) {
            weekendSpan -= 1;
        }
        return (workingDays + (daysPerWeekend * weekendSpan));
    }
    //-->
    </script>
    </body>
    </html>
      

  7.   

    晕,workingDays = 1000000 与 workingDays = 100 是一样的!这句指的是效率是一样的!当然,如何设计算法是根据需求而定的,
    如果只是简单计算一个人一生的工作天数,也不过一万多天——循环算法的效率完全接受;
    但是如果计算全国的所有成年人的工作天数,那么循环算法的效率就难以接受了。
      

  8.   

    10、11、13楼的写得都不错!但是还是不是我需要的,你们算的结束日期都是向后推了一天。并且从2010/8/1号开始,1号正好是星期天。。
    还有,如果结束那天又正好是周末又要怎么解决!
    以下是我写的!
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>    <script type="text/javascript" language="javascript">
    //入口方法
     function GetEndDate() {
                var endTime = document.getElementById("endTime");
                var startTime = document.getElementById("startTime").value;
                var workDays = document.getElementById("workDay").value;
                endTime.value =CountDate(startTime, workDays);
            }        function calculateWorkDays(fromStr, toStr) {            //声明两个日期对象
                var from = new Date();
                var to = new Date();
                //转换日期
                var fromTime = Date.parse(fromStr);
                var toTime = Date.parse(toStr);
                from.setTime(fromTime);
                from.setHours(0);
                from.setMinutes(0);
                from.setSeconds(0);
                var orgTime = from.getTime();            to.setTime(toTime);
                to.setHours(0);
                to.setMinutes(0);
                to.setSeconds(0);            //开始时间大于结束时间
                if (from.getTime() > to.getTime()) {
                    return 0;
                }            //从周六开始
                var sDayofWeek = from.getDay() + 1;
                var workdays = 0;            //非周末日 
                from.setDate(from.getDate() - (sDayofWeek % 7));
                workdays -= ((sDayofWeek - 2) > 0) ? sDayofWeek - 2 : 0;            //计算两个日期之间的天数
                var totalDays = (to.getTime() - from.getTime()) / (1000 * 60 * 60 * 24) + 1;            workdays += Math.floor(totalDays / 7) * 5;            //最后剩余天数 
                if ((totalDays % 7 - 2) > 0) {
                    workdays += (totalDays % 7 - 2);
                }            return workdays;
            }        function CountDate(startTime, wday) {
                var weekday = CheckStartTime(startTime);
                var workDays;   //最终的工作天数
                if (weekday == 0)
                    workDays = wday - 1;
                else if (weekday == 6)
                    workDays = wday - 2;
                else
                    workDays = wday;   //获得最终的工作天数
                var totalDays;   //总天数
                if (workDays > 0) {                 var weeks = Math.floor(workDays / 5);   //共几个星期
                    var days = workDays - weeks * 5;  //扣除整数星期后还有多少天                if (days == 0) {
                        totalDays = (weeks - 1) * 7 + 5;  //工作完成正好是礼拜5
                    }
                    else {
                        totalDays = weeks * 7 + days;
                    }
                    if (weekday == 0)
                        totalDays = totalDays + 1;
                    else if (weekday == 6)
                        totalDays = totalDays + 2;
                    else
                        totalDays = totalDays;
                }
                else {
                    if (weekday == 0)
                        totalDays = 1;
                    else if (weekday == 6)
                        totalDays = wday;    
                }
          
                var dd = new Date(startTime);
                
                var newdate = new Date();
                var newtimems = dd.getTime() + ((totalDays-1) * 24 * 60 * 60 * 1000);
                newdate.setTime(newtimems);            return newdate.toLocaleDateString();
            }        function CheckStartTime(startTime) {
                var dd = new Date(startTime);  
                var week = dd.getDay();
                return week;
            }
        </script></head>
    <body>
        <div>
            <div>
             startTime  <input type="text" id="startTime" value="2010/8/2"
                        size="10" />
        workDay: <input type="text" id="workDay" size="10" /> 
    endTime:<input type="text" id="endTime" value="" size="30" />
                    <input type="button" name="BT" value="Count" onclick="GetEndDate()" />
              
            </div>
        </div>
    </body>
    </html>
    还有一个bug。我的需求是:如果开始的工作日期不管是星期六或者星期天,都从起始日期开始算。并且如果是星期六,后面的星期天也要算是工作日。
    结束的日期如果是周末的话,则显示为下周一。并且显示的日期不能向后推。
    如:
    情况一:起始日期为星期天
    2010/8/1   工作 6天  则输出 2010/8/6   (为星期五)2010/8/1   工作 7天   则输出 2010/8/9  (9号为星期一)
    情况二:起始日期为星期六
    2010/8/7   工作四天   则输出 2010/8/10
    2010/8/7   工作一天   则输出 2010/8/8  (8号为星期天)
    谢谢各位啊!
      

  9.   

    lz 先把这个例子解释一下先!2010/8/7 工作四天 则输出 2010/8/10
    4 天是 7,8,9,10,显然 7 号包在其中了!2010/8/7 工作一天 则输出 2010/8/8
    1 天是 8,而 7 号被排除在外!lz 不觉得自相矛盾么?!
      

  10.   

    情况一:起始日期为星期天
    2010/8/1 工作 6天 则输出 2010/8/6 (为星期五)
    2010/8/1 工作 7天 则输出 2010/8/9 (9号为星期一)情况二:起始日期为星期六
    2010/8/7 工作一天 则输出 2010/8/7 (7号为星期六)
    2010/8/7 工作两天 则输出 2010/8/8 (8号为星期天)俺把代码修改了一下,以上两种情况都已测试通过L@_@K
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>javascript.Date.CalculateDepartureDate.html</title>
        <meta name="generator" content="editplus" />
        <meta name="author" content="[email protected]" />
        <meta name="keywords" content="" />
        <meta name="description" content="" />
    </head>
    <body>
    <script type="text/javascript">
    <!--
    /*
    需求描述:给定任意日期作为入职日期,工作N个工作日之后,计算离职日期?
    注:
        “工作日”为周一至周五,不包含周六、日。
        “首个工作日”从注册日期之后算起,即不包含注册日期在内。
        “离职日期”为最后一个工作日的后一天。如:
        入职日期:2010/8/1
        工作天数:10
        离职日期:2010/8/14
    */// 入职日期
    var entryDate = ParseDate("2010/8/1");
    // 工作天数
    var workingDays = 7;
    // 离职日期
    var departureDate = GetDepartureDate(entryDate, workingDays);document.write(GetDateString(departureDate));function GetDepartureDate(entryDate, workingDays) {
        // 每周工作天数。
        var workingDaysPerWeek = 5;
        // 离职日期
        var departureDate = null;
        // 首个工作日
        //var firstWorkingDate = GetFirstWokingDate(entryDate);    // 入职日期当日算工作日。
        var firstWorkingDate = entryDate;    // 周末跨度数
        var weekendSpan = 0;
        // 第一周工作天数。
        var firstWeekWorkingDays = 0;
        // 最后一周工作天数。
        var lastWeekWorkingDays = 0;
        // 从首个工作日之后,到离职日期之间持续的天数(包括离职日期在内)。
        var continuedDaysAfterFirstWorkingDate = 0;    if (IsMonday(firstWorkingDate)) {
            continuedDaysAfterFirstWorkingDate = GetContinuedDays(workingDays, workingDaysPerWeek, weekendSpan);
        }
        else if (IsWeekend(firstWorkingDate)) {
            var overtimeDays = 0;
            switch (firstWorkingDate.getDay()) {
                // Sunday
                case 0:
                    overtimeDays = 1;
                    break;
                // Saturday
                case 6:
                    overtimeDays = 2;
                    break;
            }
            if (workingDays > overtimeDays) {
                var normalWorkingDays = workingDays-overtimeDays;
                continuedDaysAfterFirstWorkingDate = overtimeDays + GetContinuedDays(normalWorkingDays, workingDaysPerWeek, weekendSpan);
            }
            else {
                continuedDaysAfterFirstWorkingDate = workingDays;
            }
        }
        else {
            firstWeekWorkingDays = workingDaysPerWeek - firstWorkingDate.getDay() + 1;
            if (firstWeekWorkingDays >= workingDays) {
                continuedDaysAfterFirstWorkingDate = workingDays;
            } else {
                weekendSpan += 1;
                workingDays -= firstWeekWorkingDays;
                continuedDaysAfterFirstWorkingDate = firstWeekWorkingDays + GetContinuedDays(workingDays, workingDaysPerWeek, weekendSpan);
            }
        }    // 入职日期当日算工作日。
        continuedDaysAfterFirstWorkingDate--;    departureDate = GetDateAfterGivenDate(firstWorkingDate, continuedDaysAfterFirstWorkingDate);    return departureDate;
    }
    function ParseDate(yyyyMMddString) {
        return new Date(Date.parse(yyyyMMddString));
    }
    function GetFirstWokingDate(entryDate) {
        var firstWorkingDate = GetNextDate(entryDate);    while (!IsWorkingDate(firstWorkingDate)) {
            firstWorkingDate = GetNextDate(firstWorkingDate);
        }
        return firstWorkingDate;
    }
    function IsWorkingDate(givenDate) {
        var givenWeekday = givenDate.getDay();
        return (givenWeekday >= 1 && givenWeekday <= 5)
    }
    function GetNextDate(givenDate) {
        var millisecondsPerDay = 86400000;
        return new Date(givenDate.valueOf() + millisecondsPerDay);
    }
    function GetDateString(givenDate) {
        var dateString = "";
        dateString += givenDate.getYear() + "/";
        dateString += (givenDate.getMonth() + 1) + "/";
        dateString += givenDate.getDate();
        return dateString;
    }
    function IsMonday(givenDate) {
        return givenDate.getDay() == 1;
    }
    function GetDateAfterGivenDate(givenDate, continuedDays) {
        var millisecondsPerDay = 86400000;
        return new Date(givenDate.valueOf() + (millisecondsPerDay * continuedDays));
    }
    function GetContinuedDays(workingDays, workingDaysPerWeek, weekendSpan) {
        // 周末天数。
        var daysPerWeekend = 2;
        weekendSpan += Math.floor(workingDays / workingDaysPerWeek);
        var lastWeekWorkingDays = workingDays % workingDaysPerWeek;
        if (lastWeekWorkingDays == 0) {
            weekendSpan -= 1;
        }
        return (workingDays + (daysPerWeekend * weekendSpan));
    }
    function IsWeekend(givenDate) {
        return givenDate.getDay() == 0 || givenDate.getDay() == 6;
    }
    //-->
    </script>
    </body>
    </html>