delphi - 为什么 DateUtils.pas 中的 DateTimeToMilliseconds 被标记为内部?

标签 delphi

为什么 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 上找到了这个:

Experience shows that creating two TDateTime values using the function and EncodeDateTime that are distant from each other only a millisecond, the function returns a MillisecondsBetween not return as was expected, proving that it is not accurate.

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

最佳答案

TDateTime 是一个浮点 double 值。为了最大限度地减少使用 TDateTime 值时的舍入误差,DateUtils 中的大多数计算都会将 TDateTime 转换为毫秒。

稍后,当计算准备就绪时,Int64 值将再次转换回 TDateTime 值。

internal标记是为了强调该函数是一个实现细节,不能在库外部使用。也就是说,在使用 TDateTime 值时,请使用公共(public)函数/过程。

这是函数 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.

您可以将测试延长一天以上,看看是否有异常情况。

关于delphi - 为什么 DateUtils.pas 中的 DateTimeToMilliseconds 被标记为内部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17109814/

相关文章:

delphi - 使用 Delphi 7 进行开发时,准备好使用 Delphi 2009 及更高版本了吗?

regex - TRegEx.Create 之后必须释放 TRegEx 对象吗?

mysql - 如何获取TADOQuery中字段的长度?

delphi - 有没有办法在编译时声明对方法的 const 引用?

delphi - 如何使用 Delphi Win32 编写 SOAP 1.2 客户端的最佳方式

android - Delphi XE5 发布版本的 Android 应用程序 -- 禁用互联网

multithreading - TriticalSection 是否允许多线程访问变量?

delphi - 相互依赖的程序变量和记录

c++ - 我将类型库 ( .tlb ) 导入到 Delphi 中,但函数参数似乎不正确。我该如何解决?

delphi - Delphi 中通用持有记录的等于运算符