请问如何计算两个日期之间的工作天数(即非星期六和星期日)!谢谢(100分)

  • 主题发起人 主题发起人 bastek
  • 开始时间 开始时间
B

bastek

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何计算两个日期之间的工作天数(即非星期六和星期日)!谢谢
 
最简单也可能是最笨的办法:
遍历每一天,判断是否星期六或星期日或其他规定的节假日(可自定义)
如果不是则Inc(Count) :)
看我以前写的一个函数吧:
//取得自某一日期(RzDateTimePicker1.DateTime)开始的下D个工作日是哪一天
//比如今天是12月7号,下一个工作日就是12月10号了,这个函数可以算出来
//Holiday函数判断此日期是否除星期六、日外的节假日,可自己定义(用一个表存起来)
function GetNextWorkday(D: Integer): string;
var
T:do
uble;
I: Integer;
begin
if D >= 0 then
begin
I := 1;
T := Trunc(Double(RzDateTimePicker1.DateTime));
while I <= Ddo
begin
T := T + 1;
if (DayOfWeek(T) <> 7) and (DayOfWeek(T) <> 1) and not Holiday(T) then
Inc(I);
end;
Result := FormatDateTime('yyyy"年"m"月"d"日" dddd', T);
end
else
begin
I := -1;
T := Trunc(Double(RzDateTimePicker1.DateTime));
while I >= Ddo
begin
T := T - 1;
if (DayOfWeek(T) <> 7) and (DayOfWeek(T) <> 1) and not Holiday(T) then
Dec(I);
end;
Result := FormatDateTime('yyyy"年"m"月"d"日" dddd', T);
end;
end;
 
把两个天数相减,得到总天数,然后用总天数除7,判断这两个天数之间有几个星期,
然后用星期数乘2,就是中间的周末天数,用总天数减周末天数,最后再判断这两天
是不是周末,如果是,则把这两天所在的周末也减去就可以了。
 
D6
function DaysBetween(const ANow, Athen
: TDateTime): Integer;
WeekSpan(const ANow, Athen
: TDateTime):do
uble;
查一下相关函数的解释
 
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
day:integer;
c:integer;
begin
c:=0;
day:=strtoint(format('%0.0f',[(datetimepicker2.date-datetimepicker1.Date)]));
for i:=0 to daydo
begin
if (dayofweek(datetimepicker1.date+i)<>1)and(dayofweek(datetimepicker1.date+i)<>7) then
c:=c+1;
end;
showmessage('工作日:'+inttostr(c));
end;
 
没必要用循环判断吧,简化一下:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,k,l:Integer;
wDays:Integer;
sDate:TDate;
begin
i:=Abs(Trunc(DateTimePicker1.Date)-Trunc(DateTimePicker2.Date));//两日期间隔总天数
sDate := DateTimePicker1.Date;
j:= i div 7;//两日期间隔整星期数
k:= i mod 7;//两日期间隔零星数,
// 关系: i = J * 7 + K;
wDays := j * 5;//一周五天工作
//计算零星数中的工作天数
for l := 0 to kdo
begin
if not (DayOfWeek(sDate + l) in [1,7]) then
wDays := wDays + 1;
end;

ShowMessage('两日期:'+DateToStr(DateTimePicker1.Date)+'和'+
DateToStr(DateTimePicker2.Date)+'间隔:'+ IntToStr(i)+ '天'+
' 其中工作日:'+ IntToStr(wDays)+'天');
end;
 
同意杜宝
自定义节假日就再加一个判断:把数据库中日期在此两日期之间的记录统计出来
再用上面计算出来的数减此统计数就是了。
 
function GetWorkDates(D1, D2: TDate): Integer;
var
I:Integer;
WeekS,WeekMod:Integer;
WorkDate:Integer;
begin
Result:=0;
if D1>=D2 then
exit;
I:=D2-D1;
WeekS:=I div 7;
WeekMod:=I mod 7;
WorkDate:=Weeks * 5;
for I:= 0 to WeekMod-1do
begin
if not ((DayOfWeek(D2-I)) in [1,7]) then
Inc(WorkDate);
end;

Result:=WorkDate;
end;
 
谢谢各位!zhihuali的GetWorkDates函数可作计算两个日期之间的工作日天数的最简便方法!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部