用这个代码可以动态设置上班的时间。如星期一,四,或二,五,六。
var
d:TdateTime;
i,lsLeng,lsIdx,i1:integer;
ls:array of integer;
begin
//初始化日期。
d:= now();
i1:= 12 ;//班次
//加载上班时间列表(必需是已经按从小到大排好序的),星期天为1,周6为7
setLength(ls,3);
ls[0]:=2;
ls[1]:=4;
ls[2]:=6;
lsLeng:= Length(ls);
for i:=0 to lsLeng do
begin
if i= lsLeng then
begin
ShowMessage('日期错误:输入的日期非晚班时间,无法计算出休息日期!');
exit;
end;
if DayOfWeek(d)= ls then
begin
lsIdx:= i;//记录位置
break;
end;
end;
lsIdx:= (lsIdx+lsLeng-1) mod lsLeng;
//25天的来由(7*(12/3)-3),因为5-21号是星期一,最后那个晚班,与下次的首个晚班有3天的间隔所以7*4周-3天=25天。
//但是如果是从周三开始计的话就不同了应该是+26!
if ls[lsIdx mod lsLeng] > ls[(lsIdx +1) mod lsLeng] then //因为周是循环的不是简单的周6-周4=2这么简单,所以写成这样,没办法。
d:= d+ 7*(i1 div lsLeng) - (7 + ls[(lsIdx+1) mod lsLeng ]-ls[lsIdx mod lsLeng] )
else
d:=d+ 7*(i1 div lsLeng) -( ls[(lsIdx+1) mod lsLeng]-ls[lsIdx mod lsLeng]);
//这里解决半周问题
if(i1 mod lsLeng)>0 then //如果存在半周的问题的,那只能一个一个把各班的时间间隔加上去。
begin
for i:=lsIdx to lsIdx + (i1 mod lsLeng)-1 do/
begin
if ls[i mod lsLeng] > ls[(i +1) mod lsLeng] then
d:= d+ (7 + ls[(i+1) mod lsLeng ]-ls[i mod lsLeng] )
else
d:=d+ ls[(i+1) mod lsLeng]-ls[i mod lsLeng];
end;
end;
Showmessage('下个休息日:'+ DateToStr(d));
end;