为什么DateUtils.pas中的DateTimeToMilliseconds被标记为内部? 我可以用吗?
{ Internal, converts a date-time to milliseconds }
function DateTimeToMilliseconds(const ADateTime: TDateTime): Int64;
var
LTimeStamp: TTimeStamp;
begin
LTimeStamp := DateTimeToTimeStamp(ADateTime);
Result := LTimeStamp.Date;
Result := (Result * MSecsPerDay) + LTimeStamp.Time;
end;
[Delphi XE]
我在About.com上发现了这个:
经验表明,使用函数和EncodeDateTime创建两个TDateTime值,它们彼此之间的距离只有一毫秒,该函数返回MillisecondsBetween不返回预期值,证明它不准确。
所以,如果我不关心几个小米,我应该使用它。
答案 0 :(得分:7)
TDateTime
是双点浮点数。要在使用TDateTime
值时最小化舍入错误,DateUtils中的大多数计算会将TDateTime
转换为毫秒。
稍后当计算准备就绪时,Int64
值将再次转换回TDateTime
值。
internal
标记是为了强调该函数是一个实现细节,不能在库外使用。也就是说,在使用TDateTime
值时,请使用公共函数/过程。
这是函数MilliSecondsBetween
:
program TestMSecBetween;
{$APPTYPE CONSOLE}
uses
System.SysUtils,System.DateUtils;
var
d1,d2 : TDateTime;
i,iSec,iMin,iHour,iMSec;
isb : Int64;
begin
d1 := EncodeDateTime(2013,6,14,0,0,0,0);
for i := 0 to 1000*60*60*24-1 do
begin
iHour := (i div (1000*60*60)) mod 24;
iMin := (i div (1000*60)) mod 60;
iSec := (i div 1000) mod 60;
iMSec := i mod 1000;
d2 := EncodeDateTime(2013,6,14,iHour,iMin,iSec,iMSec);
isb := MilliSecondsBetween(d2,d1);
if (isb <> i) then
WriteLn(i:10,iHour:3,iMin:3,iSec:3,iMSec:4,isb:3);
end;
ReadLn;
end.
您可以将测试扩展超过一天以查看是否存在异常。
答案 1 :(得分:1)
没有理由你不能使用它,它不会被弃用并在内部使用。
它只是标记为“内部”,因为函数头不在接口部分。如果你在那里复制标题,它应该可以工作。
如果我们'修补'这样的第三方单元,我们总是这样做,在修改之前将其复制到我们自己的搜索路径中的目录(名为PatchLibs)。这样你就不会“损坏”原始文件而且你不必担心如何重建原始文件。