Delphi 2010 中 TTimeSpan 的使用令人困惑

问题描述 投票:0回答:2

我尝试了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(双精度)已正确实现。

delphi delphi-2010 record timespan
2个回答
7
投票

您混淆了给出以给定单位表示的总量的属性与给出将值分解为各个组成部分时的部分值的属性(天、小时、分钟、秒、毫秒、刻度)。

通过这些,您可以获得每个类别的整数余数。因此,

Milliseconds
将始终在 0 到 999 之间(每秒毫秒数 - 1)。
或者,另一个例子,如果您有 72 分钟,则
TotalMinutes
是 72,但
Minutes
是 12

它与分解 DecodeDateTime

TDateTime
功能非常
相似。

而对于你想要实现的目标,你肯定需要使用

TotalMilliseconds
属性,正如 TridenT 指出的那样,但是
GetMilliseconds
的代码在
TimeSpan
中确实是正确的。


4
投票

您必须使用

TotalMilliseconds
而不是
Milliseconds
属性。

效果更好!

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

来自文档:

总毫秒数双倍
时间跨度以毫秒表示, 部分毫秒

© www.soinside.com 2019 - 2024. All rights reserved.