4

为什么 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;

[德尔福 XE]


我在 About.com 上找到了这个:

经验表明,使用函数和EncodeDateTime创建的两个TDateTime值相距只有一毫秒,函数返回一个MillisecondsBetween,没有按预期返回,证明不准确。

所以,如果我不在乎几毫秒,我应该使用它。

4

2 回答 2

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.

您可以将测试扩大一天以上,看看是否有一些异常。

于 2013-06-14T13:54:52.440 回答
1

你没有理由不能使用它,它没有被弃用和在内部使用。

它只是被标记为“内部”,因为函数头不在接口部分。如果您在那里复制标题,它应该可以工作。

如果我们像这样“修补”第三方单元,我们通常会在修改之前将其复制到我们自己的搜索路径中的目录(名为 PatchLibs)。这样您就不会“损坏”原始文件,也不必担心如何重建原始单元。

于 2013-06-14T13:56:26.167 回答