需求如下:
4个textbox,
textbox1为工时
textbox2为开始时间
textbox3为结束时间
textbox4为最终时间
需要当输入工时时根据默认的开始时间计算结束时间,显示在textbox3
另外当输入结束时间时也根据与开始时间天数,计算所需的工时,显示在textbox1代码如下:
<script language="javascript">
    function SetWorkDayTime(Type,strDays,strBeginDate,strEndDate,strDealDate)
    {     
            var txtDays = document.getElementById(strDays);          // 工时(H)
            var txtBeginDate = document.getElementById(strBeginDate);// 开始日期
            var txtEndDate = document.getElementById(strEndDate);    // 结束日期
            var txtDeadDate =  document.getElementById(strDealDate); // 最终日期
            var astrDays = Math.floor(txtDays.value/8);
        
            if(astrDays < (txtDays.value/8))
            {
                astrDays += 1 ;
            }
            
             // 效验工期
            if (txtDays.value != "")
            { 
               var regd= "^\\d+(\\.\\d+)?$"; // 非负浮点数(正浮点数   +   0) 
               var d = txtDays.value.match(regd);
               if( d == null)
               {
                    alert(GetRes(3048)); return ;//"工期格式不正确"
               }
//               else
//               {
//                    if(txtDays.value >= 1000)
//                    {
//                        alert(GetRes(3049));return ;//工期过长!工期必须 <1000
//                    }
//               }
            }
            // 时间格式检查
            var reg =   /^(\d{4})-(0\d{1}|1[0-2])-(0\d{1}|[12]\d{1}|3[01])$/;//短日期格式的正则表达式(2006-05-24)        
            var r = txtBeginDate.value.match(reg);
            if ( r == null)
             {
                alert(GetRes(3050)); return ;//"开始日期格式错误"
             }
            r = null ;
            r = txtEndDate.value.match(reg);
            if( r == null)
             {
                alert(GetRes(3051)); return ;//'结束日期格式错误'
             }
            r = null ;
            r = txtDeadDate.value.match(reg);
            if ( r == null)
            {
               alert(GetRes(3052)); return ;//'最终日期格式错误'
            }
            // 设置时间
            BegindatePart = txtBeginDate.value.split("-");
            EnddatePart = txtEndDate.value.split("-");
            DeaddatePart = txtDeadDate.value.split("-");
            beginDay = new Date(BegindatePart[0],BegindatePart[1]-1,BegindatePart[2]); 
            endDay   = new Date(EnddatePart[0],EnddatePart[1]-1,EnddatePart[2]); 
            deadDay  = new Date(DeaddatePart[0],DeaddatePart[1]-1,DeaddatePart[2]); 
            // 开始时间+ 有效工期
            strendDayLast = GetEndDateTime(beginDay,astrDays);
            astrendDay = strendDayLast.split("-");
            endDayGetLast = new Date(astrendDay[0],astrendDay[1]-1,astrendDay[2]);          
            if(Type == 1) // 修改工期时激发
            { 
                // 如果结束时间小于 计算得出的结束时间,则重新设置结束时间
                if(endDay < endDayGetLast)  
                {
                   // 重新设置结束时间             
                   txtEndDate.value = strendDayLast ;
                }
                // 如果最终时间小于结束时间,则重新设置结束时间。
                if( deadDay <  endDayGetLast)
                {
                    // 重新设置最终时间
                    txtDeadDate.value = txtEndDate.value ;
                }
                return ;
            }
            
            if(Type == 2) // 开始时间修改后,重新设置结束时间和最终时间
            {
                 // 计算开始时间 + 工期 得出的结束时间
                if(parseInt(astrDays) >= 0)
                {
                     // 如果结束时间小于 计算得出的结束时间,则重新设置结束时间
                    if(endDay < endDayGetLast)  
                    {
                       // 重新设置结束时间             
                       txtEndDate.value = GetEndDateTime(beginDay,astrDays) ;
                    }
                    // 如果最终时间小于结束时间,则重新设置结束时间。
                    if( deadDay <  endDayGetLast)
                    {
                        // 重新设置最终时间
                        txtDeadDate.value = txtEndDate.value ;
                    }
                }
                else
                {
                   if(endDay <= beginDay)  
                    {
                       // 重新设置结束时间             
                       txtEndDate.value = txtBeginDate.value ;
                    }
                    // 如果最终时间小于结束时间,则重新设置结束时间。
                    if( deadDay <=  beginDay)
                    {
                        // 重新设置最终时间
                        txtDeadDate.value = txtBeginDate.value ;
                    }
                }
                return ;
            }
            if(Type == 3) // 修改结束时间时激发
            {
                 // 计算开始时间 + 工期 得出的结束时间
                // 工期不为空
                if(parseInt(astrDays) >= 0)
                {
                    if( endDay < endDayGetLast)
                    {
                       txtEndDate.value = GetEndDateTime(beginDay,astrDays) ; 
                    }
                    else
                    {
                        if(deadDay < endDay)
                        {
                            txtDeadDate.value = txtEndDate.value;
                        }
                    }
                    if( deadDay < endDayGetLast)
                    {
                       txtDeadDate.value = GetEndDateTime(beginDay,astrDays) ; 
                    }
                }
                else
                {
                    // 如果工期为空
                    if( endDay < beginDay )
                    {
                        txtEndDate.value = txtBeginDate.value ;
                        txtDeadDate.value = txtBeginDate.value ;
                    }
                    else
                    {
                        daycount   =   parseint(math.abs(beginDay   -   endDay)   /   1000   /   60   /   60   /24)    
                        txtDays.value = GetWorkDayCount(endDay,daycount)*8;
                        
                  
                    }
                }
            }
            if(Type == 4) // 修改最终时间时激发
            {
                 // 计算开始时间 + 工期 得出的结束时间
                if( deadDay < endDay)
                {
                    // 重新设置最终时间
                    txtDeadDate.value = txtEndDate.value ;
                }
                return ;
            }   
    }

解决方案 »

  1.   

    接上面: // 根据开始时间获取和工期获取结束时间
        function GetEndDateTime(beginDate,WorkDays)
        {
    //        var indexDays = Math.floor(WorkDays/8);
    //        
    //        if(indexDays < (WorkDays/8))
    //        {
    //            indexDays += 1 ;
    //        }
            
            endDayLast = new Date(beginDate.getFullYear(),beginDate.getMonth(),beginDate.getDate());
            while( WorkDays > 0)
            {
                // 判断是否是有效工作日
                if( IsWorkDay(endDayLast) )
                {
                    WorkDays = WorkDays - 1  ;
                }
                if( WorkDays > 0)
                {
                     endDayLast.setDate(endDayLast.getDate() +  1);
                }
                
            }
            str = "";
            str += endDayLast.getFullYear() + "-";
            str += (endDayLast.getMonth()<9)?("0"+(endDayLast.getMonth()+1)):endDayLast.getMonth();
            str += "-";
            str += (endDayLast.getDate()<10)?("0"+endDayLast.getDate()):endDayLast.getDate();
            return str;
        }
        
        // 根据结束时间获取工期
        function GetWorkDayCount(EndDate,WorkDays)
        {
            DayCheck = new Date(EndDate.getFullYear(),EndDate.getMonth(),EndDate.getDate());
            var Daytemp=0;
            // 计算工期
            for(i=0;i<WorkDays;i++)
            {
                // 判断是否是有效工作日
                if( !IsWorkDay(DayCheck) )
                {
                    
                    Daytemp = Daytemp + 1;
                }
                
                     DayCheck.setDate(DayCheck.getDate() -  1);
               
            }
            return Daytemp;
        }
        
        
        // 是否是工作日
        function IsWorkDay(workday)
        {
            checkWorkDay = new Date(workday.getFullYear(),workday.getMonth(),workday.getDate());
            // 定义一个存放节假日的数组
            var holiday_array = GetHolidays();
            strworkday = "";
            strworkday += workday.getFullYear() + "-";
            strworkday += (workday.getMonth()<9)?("0"+(workday.getMonth()+1)):workday.getMonth() ;
            strworkday +=  "-";
            strworkday += (workday.getDate()<10)?("0"+workday.getDate()):workday.getDate();
            
            var isExists = 0
            for(i =0 ;i<holiday_array.length ;i++)
                {
                    if( holiday_array[i] == strworkday)
                    {
                        isExists = 1 ;
                        break ;
                    }
                }        if( checkWorkDay.getDay() == 0 || checkWorkDay.getDay() == 6 )
            {
                if(isExists == 1)
                {
                    return true ;
                }
                else
                {
                  // 如果是周末,则只需要查询数组中有无本天记录,没有则为 非工作日,有则为工作日
                    return false;
                }
            }
            else
            {
                // 如果是普通工作时间,只需判断有无本日期的纪录,有纪录表示是休息日,无纪录表示是工作日
                if(isExists == 1)
                {
                    return false ;
                }
                else
                {
                    return true ; 
                }
            }
        }  
    </script>
    后端代码:
    // 工期
                txtHours.Attributes.Add("onchange", "SetWorkDayTime(1,'" + txtHours.ClientID + "','" + txtStartDate.ClientID + "','"
                    + txtUntilDate.ClientID + "','" + txtDeadLine.ClientID + "')");
                // 开始时间
                txtStartDate.Attributes.Add("onpropertychange", "SetWorkDayTime(2,'" + txtHours.ClientID + "','" + txtStartDate.ClientID + "','"
                    + txtUntilDate.ClientID + "','" + txtDeadLine.ClientID + "')");
                // 结束时间
                txtUntilDate.Attributes.Add("onpropertychange", "SetWorkDayTime(3,'" + txtHours.ClientID + "','" + txtStartDate.ClientID + "','"
                     + txtUntilDate.ClientID + "','" + txtDeadLine.ClientID + "')");
                // 最终时间
                txtDeadLine.Attributes.Add("onpropertychange", "SetWorkDayTime(4,'" + txtHours.ClientID + "','" + txtStartDate.ClientID + "','"
                      + txtUntilDate.ClientID + "','" + txtDeadLine.ClientID + "')");其中有一些计算是否工作日的方法可以忽略
    现在问题有2:
    1。)输入工时可以更新结束时间,但是只能往大的方向改变(比如第一次输入9,结束 日期=开始日期+1,第二次输入20则根据规则结束日期改变,但是第三次如果从20改回9,则结束日期不会从第二次输入的状态改回)
    2。)输入结束日期无法更新工期的textbox改了半天没办法,麻烦诸位高手解惑,感激不尽