我在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
中是正确的。