6

我在 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(双精度)方法已正确实现。

4

2 回答 2

7

当您将其分解为其组件(天,小时,分钟,秒,毫秒,滴答声) 时,您将给出以给定单位表示的总量的属性与给出值的一部分的属性混淆了。

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

它与分解 a 的功能非常相似DecodeDateTimeTDateTime

而对于您想要实现的目标,您肯定需要使用该TotalMilliseconds属性,正如 TrdenT 指出的那样,但 for 的代码GetMillisecondsTimeSpan.

于 2010-05-22T17:23:51.113 回答
3

您必须使用TotalMilliseconds而不是Milliseconds属性。

效果更好!

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

从文档:

TotalMilliseconds 双倍
时间跨度表示为毫秒和部分毫秒

于 2010-05-22T09:13:51.057 回答