如何计算出两个日期之间有多少个工作日?
在DateTimePicker1和DateTimePicker2里分别填如两个日期 如何计算出这两个日期之间有多少个工作日(周六周日剔除)? 问题点数:50、回复次数:12Top
1 楼smiler007(笑一笑)回复于 2005-02-26 15:50:50 得分 0
uses DateUtils
里面有个DaysBetween 函数Top
2 楼myart(寒林)回复于 2005-02-26 15:56:39 得分 0
uses DateUtils
里面有个DaysBetween 函数
再配上两个是日期间有几个星期(函数不记得了),不就可以解决了!Top
3 楼zzlazio(sritsb)回复于 2005-02-26 16:05:20 得分 5
呵呵..剔除周六周日还真不好办诶..
可以考虑把DaysBetween 得出的(数字/7)*2应该就是双休日数.
不过要考虑下开始是星期几和结束是星期几的话那样算不太准哦..Top
4 楼cyp207(cyp207)回复于 2005-02-26 16:15:27 得分 5
看看这样可以不,取得一共有几天之后,找到第一个星期一和最后一个星期天。中间的天数*5/7以及两头可用的天数,就是正常的工作日。然后可以把输入那个时间段的所有其它假日剔除(可以自己定假日日期),剔除一个就把工作日总和减1。使用dayofweek判断假日是否属于星期六或星期天,是的话,就不用减1,把它当成周末休息。Top
5 楼gxgyj(杰克逊)回复于 2005-02-26 16:38:08 得分 10
procedure TForm1.Button1Click(Sender: TObject);
var
temp1:Tdatetime;
i:integer;
begin
temp1:=form1.DateTimePicker1.date;
i:=0;
while temp1<=form1.DateTimePicker2.Date do begin
case dayofweek(temp1) of
1:i:=i; //'星期天';
2:i:=i+1; //'星期一';
3:i:=i+1; //'星期二';
4:i:=i+1; //'星期三';
5:i:=i+1; //'星期四';
6:i:=i+1; //'星期五';
7:i:=i; //'星期六';
end;//end case
temp1:=temp1+1;
end;//end while
showmessage(floattostr(i));
end;Top
6 楼henryluo(憨人在线)回复于 2005-02-26 17:13:08 得分 0
同意楼上的,,Top
7 楼zswang(伴水清清)(专家门诊清洁工)回复于 2005-02-27 00:27:57 得分 5
//参考如下代码
function WorksDay( //计算两个日期间有多少个工作日
mStartDate: TDate; //开始日期
mEndDate: TDate //终止日期
): Integer; //返回两个日期间的工作日,如果输入错误则返回-1
var
vDaySpace: Integer;
I: Integer;
begin
Result := -1;
if mEndDate < mStartDate then Exit;
vDaySpace := Trunc(mEndDate) - Trunc(mStartDate) + 1;
Result := vDaySpace div 7 * 5; //计算有多少个星期,每个星期5个工作日
for I := 0 to vDaySpace mod 7 - 1 do //加上剩余天数中的工作日
Result := Result + Ord(DayOfWeek(mStartDate + I) in [2..6]);
end; { WorksDay }
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := IntToStr(WorksDay(DateTimePicker1.Date, DateTimePicker2.Date));
end;Top
8 楼jinjazz(近身剪)回复于 2005-02-27 15:22:27 得分 5
我也贴一个~~和伴水老大的规则有点不一样,就是和daysbetween一样,1日到n日 算n-1天~~
function WorksDay( //计算两个日期间有多少个工作日
mStartDate: TDate; //开始日期
mEndDate: TDate //终止日期
): Integer; //返回两个日期间的工作日,如果输入错误则返回-1
var m,n:integer;
begin
m:=DaysBetween(mStartDate,mEndDate);
n:=(m div 7)*2;
if DayOfWeek(mStartDate)>DayOfWeek(mEndDate) then
begin
n:=n+2;
if DayOfWeek(mStartDate)=1 then n:=n+1;
if DayOfWeek(mEndDate)=1 then n:=n-1;
if DayOfWeek(mEndDate)=7 then n:=n-1;
end;
result:=m-n;
end;Top
9 楼jinjazz(近身剪)回复于 2005-02-27 15:34:49 得分 5
好像上面的错了~~改改
function WorksDay( //计算两个日期间有多少个工作日
mStartDate: TDate; //开始日期
mEndDate: TDate //终止日期
): Integer; //返回两个日期间的工作日,如果输入错误则返回-1
var m,n:integer;
begin
Result := -1;
if mEndDate < mStartDate then Exit;
m:=DaysBetween(mStartDate,mEndDate);
n:=(m div 7)*2;
if m mod 7<>0 then
begin
if DayOfWeek(mStartDate)>DayOfWeek(mEndDate) then n:=n+2;
if DayOfWeek(mStartDate)=1 then n:=n+1;
if DayOfWeek(mEndDate)=1 then n:=n-1;
end;
result:=m-n;
end;Top
10 楼ideacao(草木)回复于 2005-02-28 09:46:24 得分 5
upTop
11 楼victor_yang(victoryang)回复于 2005-03-02 08:07:44 得分 5
var
WorkDays:integer;
Delta1:integer;
i:integer;
begin
WorkDays:= WeeksBetween(Date1,Date2)*5; //一个星期有5天工作日,先算整周的。
Delta1:=Trunc(Date1)+WeeksBetween(Date1,Date2)*7; //剩下最后的几天
for i:=Delta1 to Trunc(Date2) do //循环判断
begin
if (DayOfWeek(i)>1) and (DayOfWeek(i)<7) then //如果是星期一到星期五就加一个工作日
Inc(WorkDays);
end;
Result:=WorkDays;
以上经过测试!!!Top
12 楼caiso(十年磨一剑)回复于 2005-03-02 08:29:48 得分 5
顶一下Top




