CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

如何计算出两个日期之间有多少个工作日?

楼主tigsin()2005-02-26 15:48:50 在 Delphi / VCL组件开发及应用 提问

在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

相关问题

  • sql如何计算两个日期间的工作日,剔除节假日
  • 如何确定两个日期之间有多少个工作日?
  • 如何计算工作日问题
  • 问一个计算工作日的问题?
  • 日期计算
  • 日期计算。。。
  • 日期计算
  • 当前日期加上n个工作日,怎么去掉节假日时间?????
  • 如何计算两个日期间隔多少天?
  • 计算两个日期相差多少天怎么做?

关键词

  • 函数
  • date
  • dayofweek
  • menddate
  • 工作日
  • mstartdate
  • daysbetween
  • 日期
  • 剔除
  • 计算

得分解答快速导航

  • 帖主:tigsin
  • zzlazio
  • cyp207
  • gxgyj
  • zswang
  • jinjazz
  • jinjazz
  • ideacao
  • victor_yang
  • caiso

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo