在Delphi 2010中混淆了TTimeSpan的使用

时间:2010-05-22 08:52:47

标签: delphi delphi-2010 record timespan

我在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 

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

UPDATE:正确实现方法GetTotalMilliseconds(双精度)。

2 个答案:

答案 0 :(得分:7)

您将给出以给定单位表示的总金额的属性与赋予将其分解为组件时的值部分的属性混淆(天,小时,分钟,秒,毫秒,刻度)。

通过这些,您可以获得每个类别的整数余数。因此, Milliseconds将始终介于0到999之间(每秒毫秒数 - 1)。
或者,另一个示例,如果您有 72分钟,TotalMinutes为72,但Minutes为12

非常DecodeDateTime功能类似,可以分解TDateTime

对于你想要实现的目标,你肯定需要使用TotalMilliseconds属性,正如TridenT指出的那样,GetMilliseconds的代码在TimeSpan中确实是正确的。

答案 1 :(得分:3)

您必须使用TotalMilliseconds代替Milliseconds属性。

效果更好!

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

来自文档:

  

TotalMilliseconds Double
  Timespan表示为毫秒和   部分毫秒