Delphi EncodeDateTime 和 EncodeTime 时间部分不同

问题描述 投票:0回答:1

这是一个演示该问题的示例:

var
   fdt, fndt : Double;
   dt, dt2 : TDateTime;
begin
    dt := EncodeDateTime(2023, 12, 31, //
        20, 10, 5, 100);
    dt2 := EncodeTime(20, 10, 5, 100);
    fdt := Frac(dt);
    fndt := Frac(dt2);
    Memo1.Lines.Add('Equal: ' + BoolToStr(fdt = fndt, True) + CRLF + //
        FloatToStr(fdt) + CRLF +  //
        FloatToStr(fndt) + CRLF +  //
        FormatDateTime('HH:NN:SS ZZZ', fdt) + CRLF +  //
        FormatDateTime('HH:NN:SS ZZZ', fndt) + CRLF +  //
        ''
        );
    Exit;

结果是:

 Equal: False 
 0,840336805558763 
 0,840336805555556 
 20:10:05 100
 20:10:05 100

如您所见,时间部分与 Double 不同,但与格式化字符串相同。

为什么它们不同?

据我所知,EncodeDateTime 是 EncodeDate + EncodeTime。 日期 = Trunc(日期)。 所以小数部分必须相同!但事实并非如此。为什么? 也许一些时区信息?

感谢您提供有关它的任何信息。

环境:Win 11,Delphi S10,32位Exe。时区:欧洲/布达佩斯 (+2/+1)。

datetime delphi time difference fractions
1个回答
0
投票

由于浮点的不准确性质,使用

=
运算符比较浮点值是否相等通常不准确。您必须考虑 epsilon 来查看这些值是否“足够接近”以被视为相等。

在这种情况下,您可以使用

DateUtils.SameTime()
DateUtils.CompareTime()
来代替。

© www.soinside.com 2019 - 2024. All rights reserved.