我在Delphi 2010中尝试了新的Record类型的TTimeSpan。但是,我鼓励一个非常奇怪的问题。

assert(TTimeSpan.FromMilliseconds(5000).Milliseconds = 5000);

该断言不会通过。 “TTimeSpan.FromMilliseconds(5000).Milliseconds”的值预期为5000,但为0。

我更深入地探讨:
function TTimeSpan.GetMilliseconds: Integer;
begin
  Result := Integer((FTicks div TicksPerMillisecond) mod 1000);
end;

FTicks = 50000000
TicksPerMillisecond = 10000
FTick div TicksPerMillisecond = 50000000 div 10000 = 5000
(FTick div TicksPerMillisecond) mod 1000 = 5000 mod 1000 = 0 // I do not understand, why mod 1000
Integer((FTick div TicksPerMillisecond) mod 1000) = Integer(0) = 0

我的代码解释是正确的,不是吗?

更新:方法GetTotalMilliseconds( double )已正确实现。

最佳答案

当您将给定单位表示的总数的属性与分配给的属性分成几部分(天,小时,分钟,秒,毫秒,滴答)时,会使属性混淆。

有了这些,就可以得到每个类别的整数余数。因此, Milliseconds始终在0到999 (每秒的毫秒数-1)之间。
或者,例如,如果您的为72分钟,则TotalMinutes为72,而Minutes为12

分解DecodeDateTime
TDateTime函数非常相似

对于要实现的目标,您确实需要使用TritT指出的TotalMilliseconds属性,但是GetMilliseconds的代码确实在TimeSpan中是正确的。

10-08 05:17