TDateTime 日期时间值的比较

编程中,对日期类型TDateTime、TDate、TTime之间的比较和判断,很是棘手。依据本人经验,写了一个比较函数,使用中比较上手。说明如下:

1、时间TDateTime相当于是Double,即双精度数64位,它用11位表示e,53位表示精度(整数小数一起),最前面一位表示正负。

2、TDateTime的整数部分:1天=1,标准日期值,0表示公元1899-12-30,当整数部分大于0,由标准日期累加天数,小于0由由标准日期累加天数。

3、小数部分:1/1000秒=0.00000001,0 表示一天的 00:00:00 000。通过累加0.00000001计数毫秒,递加时分秒。

4、比较两个时间值,检测二值相等,只要二时间差的绝对值<0.00000001即可。这个值如果精确范围,应该是0


函数定义如下:

function DataTimeCompare(D1,D2:TDateTime):integer;  // 0等于 1大于 -1小于
var k:Double;
begin
  Result:=0;
  K:=abs(D1-D2);
  if (K>=0) and (K<0.0000000099999999) then Result:=0
  else begin
     if (D1-D2)>=0 then Result:=1
                   else Result:=-1;
  end;
end;

参数TDateTime类型,同时TDate和Time,均可使用。

procedure TForm1.Button1Click(Sender: TObject);
var mydate1,mydate2,mydate3,mydate4: TDateTime;
    T1,T2:TTime;

begin
  T1 := EncodeTime(0, 0, 0, 0);
  T2 := EncodeTime(0, 0, 0, 1);

  mydate1 := EncodeDateTime(2018, 10, 1, 0, 0, 0, 0);
  mydate2 := EncodeDateTime(2018, 10, 1, 0, 0, 0, 1);
  mydate3 := EncodeDateTime(2018, 10, 1, 0, 0, 0, 2);
  Edit1.text:=Format('%.8f', [mydate1]);
  Edit2.text:=Format('%.8f', [mydate2]);
  Edit3.text:=Format('%.8f', [mydate3]);
  Showmessage(IntToStr(DataTimeCompare(mydate1,mydate1)));
  Showmessage(IntToStr(DataTimeCompare(mydate2,mydate1)));
  Showmessage(IntToStr(DataTimeCompare(mydate1,mydate2)));
                                                          }
  Showmessage(IntToStr(DataTimeCompare(T2,T2)));
  Showmessage(IntToStr(DataTimeCompare(T1,T2)));
  Showmessage(IntToStr(DataTimeCompare(T2,T1)));
end;

注意单元中,加入Uses DateUtils,

你可能感兴趣的:(TDateTime 日期时间值的比较)