一、Delphi里有没有直接对日期中的年、月、日、时、分、秒进行加减的函数(类似于VB中的DateAdd(interval, number, date))?
二、下面函数使用是否有问题,为什么返回的值不对
uses DateUtils;procedure TForm1.Button1Click(Sender: TObject);
var
  time1,time2:TDateTime;
begin
  time1 := strtodatetime('2004-09-01 01:34:21');
  time2 := strtodatetime('2004-09-01 01:38:21');
  ShowMessage(IntToStr(MinutesBetween(time2, time1)));
end;
返回4
procedure TForm1.Button1Click(Sender: TObject);
var
  time1,time2:TDateTime;
begin
  time1 := strtodatetime('2004-09-01 01:34:21');
  time2 := strtodatetime('2004-09-01 01:37:21');
  ShowMessage(IntToStr(MinutesBetween(time2, time1)));
end;
返回2
正确值应该是3,
SecondsBetween()函数也有这种问题,有时正确,有时又会误差一秒。
这种问题应该如何处理?

解决方案 »

  1.   

    试过了,确实有这样的问题,怀疑是delphi这个函数算法有问题。。
      

  2.   

    第一个问题,有,IncYear,类推。
      

  3.   

    1.Delphi里有没有直接对日期中的年、月、日、时、分、秒进行加减的函数
    uses DateUtilsIncYear(const AValue: TDateTime; const ANumberOfYears: Integer = 1): TDateTime;
    IncMonth(const Date: TDateTime; NumberOfMonths: Integer = 1):TDateTime;
    IncDay(const AValue: TDateTime; const ANumberOfDays: Integer = 1): TDateTime;IncHour(const AValue: TDateTime; const ANumberOfHours: Int64 = 1): TDateTime;
    IncMinute(const AValue: TDateTime; const ANumberOfMinutes: Int64 = 1): TDateTime;
    IncSecond(const AValue: TDateTime; const ANumberOfSeconds: Int64 = 1): TDateTime;
      

  4.   

    第二个问题,看了一下Delphi自己带的源码,里面有较多的浮点操作,可能是由于计算精度造成的。
      

  5.   

    MinutesBetween函数本身没有错,而是你strtodatetime('2004-09-01 01:34:21')转化时的不精确导致的。用如下面的函数合成一日期试。function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;procedure TForm1.Button1Click(Sender: TObject);
    var
      time1,time2:TDateTime;
    begin
      time1:=encodetime(1,34,21,0);
      time2:=encodetime(1,37,21,0);
      ShowMessage(IntToStr(MinutesBetween(time2, time1)));
    end;
    结果为值3
      

  6.   

    TO haipin(今天你Delphi8了吗?)
    ----------------------------------------------
    procedure TForm1.Button2Click(Sender: TObject);
    var
      time1,time2:TDateTime;
    begin
      time1:=encodetime(1,34,21,0);
      time2:=encodetime(1,36,21,0);
      ShowMessage(IntToStr(MinutesBetween(time2, time1)));
    end;
    返回结果为1
    看来不是strtodatetime('2004-09-01 01:34:21')转化时的不精确导致的
      

  7.   

    function MinutesBetween1(const ANow, AThen: TDateTime): Integer;
     begin
        Result:=ceil(MinuteSpan(ANow, AThen));
     end;
      

  8.   

    To zjqyb
    ------------------------------------
    uses DateUtils,math;function MinutesBetween1(const ANow, AThen: TDateTime): Integer;
     begin
        Result:=ceil(MinuteSpan(ANow, AThen));
     end;procedure TForm1.Button2Click(Sender: TObject);
    var
      time1,time2:TDateTime;
    begin
      time1 := strtodatetime('2004-09-01 01:34:21');
      time2 := strtodatetime('2004-09-01 01:38:21');
      ShowMessage(IntToStr(MinutesBetween1(time2, time1)));
    end;返回结果为5,也不对
      

  9.   

    time1 := timeof(strtodatetime('2004-09-01 02:34:0'));
      time2 := timeof(strtodatetime('2004-09-01 02:38:0'));
      ShowMessage(inttostr(Minuteof(time2)-MinuteOf(time1)));