两个日期相减怎么取得他们之间的年、月数。
我用这个
var
  Form1: TForm1;
  y,m,d:integer;
implementation
  uses DateUtils;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
 y:=0;
 m:=0;
 d:=0;
y:=yearsBetween(StrToDate(Edit2.Text),StrToDate(Edit1.Text));
m:=MonthsBetween(StrToDate(Edit2.Text),StrToDate(Edit1.Text));
  if (y<>0)then
  m:=m mod 12;
edit3.Text:=inttostr(y);
edit4.Text:=inttostr(m+1);
end;
end.
在计算1-3月份时总是出错,有没有更好一点的函数,这个太烂,不好用,或者那位大虾有自己编写的代码,可否赐教一下,谢谢!!!

解决方案 »

  1.   

    如果用edit放date ,可以取字符前4位得年相减,月份类似。
    另外
      if y>0 then
       begin
        m:=m mod 12;
        label2.Caption:='month'+inttostr(m+1);
       end
      else
       begin
        label2.Caption:='month'+inttostr(m)
       end;
        label1.Caption:='year'+inttostr(y);
      

  2.   

    相减后要想精确的得到年数和月数是不现实也没意义的。
    因为年可能是365或者366,月可能是28~31
    唯一精确的就是天数delphi 提供了日期和月份差的函数,但是它是利用每月平均天数计算的,你的日期差的越多它就越准确。
      

  3.   

    procedure YearAndMonthBetween(const D1,D2:TDateTime; var Y,M:Integer);
    begin
      M  := (YearOf(D2)-YearOf(D1))*12 + MonthOf(D2) - MonthOf(D1);
      Y  :=  YearOf(D2)-YearOf(D1);
    end;procedure TForm1.Button1Click(Sender: TObject);//测试一下
    var
      D1, D2 : TDateTime;
      Y , M  : integer;                            //Y,M用来存放年、月的差
    begin
      D1 := VarToDateTime('2006-3-2');
      D2 := VarToDateTime('2008-8-8');
      YearAndMonthBetween(D1,D2,Y,M);
      ShowMessage(Format('相差%d个年度。相差%d个月份。',[Y,M]));
    end;
      

  4.   

    忘记说:
    uses DateUtils;测试结果是:相差2个年度。相差29个月份。
      

  5.   

    倒...
    DateUtils单元里有了...
    YeasBetween()
    MonthsBetween()
      

  6.   

    pazee(耙子)(今年过年不收礼,收礼只收尿不湿) ( ) 信誉:137    Blog  2007-1-21 22:18:46  得分: 0  
     
     
       
    相减后要想精确的得到年数和月数是不现实也没意义的。
    因为年可能是365或者366,月可能是28~31
    唯一精确的就是天数delphi 提供了日期和月份差的函数,但是它是利用每月平均天数计算的,你的日期差的越多它就越准确。  
     
    经大虾这么一说心里立马明白了,还是本质、基础、有深度的东西容易从根本上理解问题,找到问题。但这样也就是delphi本身自带的函数是存在缺陷的了,那么有没有很好的方法来解决这个问题呢,我的程序是一个有关劳动合同的,所以必须知道合同签订人的签订期限(也就是几年几个月),还望大虾指点
      

  7.   

    不能说Delphi 提供的函数有缺陷,因为你和delphi对日期差的理解和要求不同,它是不适合你的需求。对于你的问题可不可以这么理解。
    1、签合同的人签定的有效期不是天数,而是到期时候的年月日,比如 今天是 2007/01/23,明年2008/01/22到期。
    2、确定了时间段之后,你需要统计他们需要经历的月份数,有了月份数在 div 12 就是年数了。
      

  8.   

    //**************************************
    // 参数:
    //  ABDate: 起始日期
    //  AEDate: 终止日期
    // 返回值: 返回月份差
    //**************************************
    function DateMonthBetween(const ABDate, AEDate: TDateTime):integer;
    var
      BDate, EDate: TDateTime;
      wBYear, wBMonth, wBDay: WORD;
      wEYear, wEMonth, wEDay: WORD;
    begin
      // 保证日期顺序
      if ABDate > AEDate then begin
        BDate:= AEDate;
        EDate:= ABDate;
      end
      else begin
        BDate:= ABDate;
        EDate:= AEDate;
      end;
      // 分解日期
      DecodeDate(BDate, wBYear, wBMonth, wBDay);
      DecodeDate(EDate, wEYear, wEMonth, wEDay);  Result:= wEMonth - wBMonth + (wEYear - wBYear) * 12;
      // 判断日期差是否足月,不足月份减一
      if wEDay+1 < wBDay then
        Dec(Result);
    end;返回值月份,要得到年份用月份 div 12 就行了