加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 为什么DateUtils.pas中的DateTimeToMilliseconds被标

发布时间:2020-12-15 09:34:37 所属栏目:大数据 来源:网络整理
导读:为什么DateUtils.pas中的DateTimeToMilliseconds被标记为内部? 我可以用吗? { Internal,converts a date-time to milliseconds }function DateTimeToMilliseconds(const ADateTime: TDateTime): Int64;var LTimeStamp: TTimeStamp;begin LTimeStamp := Dat
为什么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.

所以,如果我不关心几个milisecs,我应该使用它.

解决方法

TDateTime是浮点数的两倍.为了在使用TDateTime值时最小化舍入误差,DateUtils中的大多数计算都将TDateTime转换为毫秒.

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

内部标记是为了强调该功能是一个实现细节,不能在库外使用.也就是说,在使用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);
  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,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.

您可以将测试扩展超过一天,以查看是否存在异常.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读