需求如下:
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 ;
}
}
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 ;
}
}
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改了半天没办法,麻烦诸位高手解惑,感激不尽