在DateTimePicker1和DateTimePicker2里分别填如两个日期 如何计算出这两个日期之间有多少个工作日(周六周日剔除)?

解决方案 »

  1.   

    uses DateUtils里面有个DaysBetween 函数
      

  2.   

    uses DateUtils里面有个DaysBetween 函数
    再配上两个是日期间有几个星期(函数不记得了),不就可以解决了!
      

  3.   

    呵呵..剔除周六周日还真不好办诶..
    可以考虑把DaysBetween 得出的(数字/7)*2应该就是双休日数.不过要考虑下开始是星期几和结束是星期几的话那样算不太准哦..
      

  4.   

    看看这样可以不,取得一共有几天之后,找到第一个星期一和最后一个星期天。中间的天数*5/7以及两头可用的天数,就是正常的工作日。然后可以把输入那个时间段的所有其它假日剔除(可以自己定假日日期),剔除一个就把工作日总和减1。使用dayofweek判断假日是否属于星期六或星期天,是的话,就不用减1,把它当成周末休息。
      

  5.   

    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;
      

  6.   

    //参考如下代码
    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;
      

  7.   

    我也贴一个~~和伴水老大的规则有点不一样,就是和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;
      

  8.   

    好像上面的错了~~改改
    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;
      

  9.   

    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;以上经过测试!!!