--2007-6-18 19:01:13
超级难ASP时间差计算题
问题:有两个字段starttime,endtime,要求按照8小时工作时间计算之间时间差(小时为单位)
条件:
1.在一天里,已8小时工作时间为准(8:30-12:00 13:00-17:30)计算出有效的时间差
2.如果超过一天的,要判断之间是否有(周末,假日(五月长假,十一长假)),如果有要减去其8小时,得出有效的时间差
例如:starttime:2006-8-31 17:23:49,endtime:2006-9-6 12:15:35
问题解决,立即揭帖!
两个时间直接相减,然后把其中8小时以外的和周末的时间再减掉。
首先把首尾两天8小时以外的时间拿出来,减掉,再把其中N天的时间拿出来减掉,周末和节假日的另外减,可以写个函数。
--------------------------------------------------------------------------------
帮顶
--------------------------------------------------------------------------------
首先把ENDTIME的DAY减1 然后减去开始时间的DAY 再判断中间有几天节假日 这里要注意 如果节假日刚好在开始时间或者结束时间当天 则把开始时间推后一天 按你的例子就变成2006-9-1 8:30:00 或者把结束时间提前 即变成2006-9-5 17:30 然后再计算中间的节假日 算完后乘8 即为整天时间内的时间差
然后再算时间 前面说了把ENDTIME的DAY减1 就是为了防止结束时间的小时数和开始时间的差不确定 所以将结束时间的小时数加8 再减去开始时间的小时数 这样就可以了 如果还要考虑中间的休息时间 就分别减去休息前时间和休息后时间 两个再相加就OK了!~ 当然中间少不了要好多判断的…………
--------------------------------------------------------------------------------
多谢大家的分析,可是用asp怎么实现这么多判断呢?我是做C++通信编程,asp不太熟,那位兄弟能写个asp的伪代码吗?
--------------------------------------------------------------------------------
If ddatediff("h",endtime,starttime)<8 Then
'8小时之内
Else
'判断是不是周末,假日(五月长假,十一长假)
End If
--------------------------------------------------------------------------------
ding
--------------------------------------------------------------------------------
ding
--------------------------------------------------------------------------------
难道是不难,判断起来比较复杂而已~
--------------------------------------------------------------------------------
想清楚了,慢慢写就好了
--------------------------------------------------------------------------------
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
Response.Buffer = true
Server.ScriptTimeout = 90
Session.CodePage = 65001
'年,月,日,周,小时,分钟
'工作分时:8:30 - 12:00 13:00-18:30
'Array(2006,9,12,4,15,22)
Dim newStartTime,newEndTime,SetHoliday
newStartTime = "2006-9-12 07:32"
newEndTime = "2006-9-12 08:36"
'设定节假日
SetHoliday = Array(51,52,53,54,55,56,57,930,101,102,103,104)
'计算时间
function CheckTime(StartTime,EndTime)
Dim SubStartTime,SubEndTime,TimeCache,GetStandardStartTime
'初始化时间
SubStartTime = FormatStartTime(StartTime)
SubEndTime = FormatEndTime(EndTime)
'做详细的时间推算
TimeCache = 0
GetStandardStartTime = TimeSingle(SubStartTime,SubEndTime)
'(0)本时间段开始时间,(1)本时间段结束时间,(2)下个时间段开始时间
While GetStandardStartTime(0)
if not CheckWeek(StartTime) and not CheckHoliday(StartTime) then
TimeCache = GetStandardStartTime(1)
end if
if GetStandardStartTime(2) then
SubStartTime = GetStandardStartTime(2)
GetStandardStartTime = TimeSingle(SubStartTime,SubEndTime)
end if
Wend
CheckTime = TimeCache'"本时间段开始时间:" & GetStandardStartTime(0) & "<br />本时间段结束时间:" & GetStandardStartTime(1) & "<br />下个时间段开始时间:" & GetStandardStartTime(2)
end function
'计算时间差
function AccountTime(setTime,TimePart)
AccountTime = DateDiff("n",setTime,AccountDefaultTime(setTime) & TimePart)
end function
'计算默认时间
function AccountDefaultTime(setTime)
AccountDefaultTime = Year(setTime) & "-" & Month(setTime) & "-" & Day(setTime) & " "
end function
'格式化开始时间
function FormatStartTime(StartTime)
Dim StartTimeCache
StartTimeCache = StartTime
'判断早上上班之前,当天开始的任务
if AccountTime(StartTime,"8:30") > 0 then
StartTimeCache = AccountDefaultTime(StartTime) & "8:30"
'判断中午休息时开始任务
elseif AccountTime(StartTime,"12:00") < 0 and AccountTime(StartTime,"13:00") > 0 then
StartTimeCache = AccountDefaultTime(StartTime) & "13:00"
'判断下班后开始的任务
elseif AccountTime(StartTime,"17:30") <= 0 then
StartTimeCache = SubEndTime = DateAdd("h",24,AccountDefaultTime(StartTime) & "8:30")
end if
FormatStartTime = StartTimeCache
end function
'格式化结束时间
function FormatEndTime(EndTime)
Dim EndTimeCache
EndTimeCache = EndTime
'判断下午下班后结束任务
if AccountTime(EndTime,"17:30") < 0 then
EndTimeCache = AccountDefaultTime(EndTime) & "17:30"
'判断在中午结束任务
elseif AccountTime(EndTime,"12:00") < 0 and AccountTime(EndTime,"13:00") > 0 then
EndTimeCache = AccountDefaultTime(EndTime) & "12:00"
'判断在早上上班前结束任务
elseif AccountTime(EndTime,"8:30") > 0 then
EndTimeCache = SubEndTime = DateAdd("h",-24,AccountDefaultTime(EndTime) & "17:30")
end if
FormatEndTime = EndTimeCache
end function
'单个任务时间段计算
function TimeSingle(ParStartTime,EndTime)
Dim ParEndTime,ParUseTime,NextStartTime
ParEndTime = false'时间段不存在
ParUseTime = false'时间段所花费的时间
NextStartTime = false'下一个时间段开始
'计算上午工作时间
if AccountTime(ParStartTime,"8:30") <= 0 and AccountTime(ParStartTime,"12:00") >= 0 then
if DateDiff("n",EndTime,AccountDefaultTime(StartTime) & "8:30") < 0 and DateDiff("n",EndTime,AccountDefaultTime(StartTime) & "12:00") > 0 then
ParEndTime = EndTime
ParUseTime = DateDiff("n",StartTime,ParEndTime)
elseif DateDiff("n",EndTime,AccountDefaultTime(StartTime) & "12:00") <= 0 then
ParEndTime = AccountDefaultTime(StartTime) & "12:00"
ParUseTime = DateDiff("n",StartTime,ParEndTime)
NextStartTime = AccountDefaultTime(StartTime) & "13:00"
end if
elseif AccountTime(ParStartTime,"13:00") <= 0 and AccountTime(ParStartTime,"17:30") >= 0 then
if DateDiff("n",EndTime,AccountDefaultTime(StartTime) & "13:00") < 0 and DateDiff("n",EndTime,AccountDefaultTime(StartTime) & "17:30") > 0 then
ParEndTime = EndTime
ParUseTime = DateDiff("n",StartTime,ParEndTime)
elseif DateDiff("n",EndTime,AccountDefaultTime(StartTime) & "17:30") <= 0 then
ParEndTime = AccountDefaultTime(StartTime) & "17:30"
ParUseTime = DateDiff("n",StartTime,ParEndTime)
NextStartTime = DateAdd("h",24,AccountDefaultTime(StartTime) & "8:30")
end if
end if
TimeSingle = Array(ParEndTime,ParUseTime,NextStartTime)
end function
'检查星期
function CheckWeek(TimeStr)
Dim SubWeek
SubWeek = Weekday(TimeStr)
if SubWeek = 1 or SubWeek = 7 then
CheckWeek = true
end if
end function
'检查节假日
function CheckHoliday(TimeStr)
Dim SubHoliday,i
SubHoliday = Month(TimeStr) & Day(TimeStr)
i = 0
do While i <= UBound(SetHoliday)
if SubHoliday - SetHoliday(i) = 0 then
CheckHoliday = true
end if
i = i + 1
loop
end function
%>
<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<%=CheckTime(newStartTime,newEndTime)%><br />
<br />
<br />
<%=DateDiff("n",newStartTime,newEndTime)%><br />
<%=Now%>
</body>
</html>
相关内容
下列内容与有着内在的联系,建议您一并阅读。