Delphi 2010中TTimeSpan使用方法的困惑

6

我尝试使用 Delphi 2010 中的新记录类型 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(双精度)方法已经正确实现。

2个回答

7
你混淆了给出特定单位下总量的属性和将其分解成组件(天、小时、分钟、秒、毫秒、时刻)后得到的价值部分的属性。对于这些属性,你会得到每个类别的整数余数。因此,毫秒将始终介于0和999之间(每秒的毫秒数-1)。或者,另一个例子,如果你有72分钟,则TotalMinutes为72,但Minutes为12。这与DecodeDateTime函数分解TDateTime非常相似。对于你要实现的目标,你肯定需要使用TotalMilliseconds属性,正如TridenT指出的那样,但是TimeSpan中GetMilliseconds的代码确实是正确的。

谢谢Francois,现在我明白逻辑了。 - stanleyxu2005

3

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

这样效果更好!

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

来自文档:

TotalMilliseconds 双精度浮点数
表示时间段的毫秒数和毫秒部分


嘿,伙计,谢谢,这很有效!毫秒的错误结果让我感到困惑。在我看来,TTimeSpan是一个不可变的数据类型,因此任何修改都应该返回一个新实例。我猜想,GetTotalMilliseconds以双精度返回值,并且GetMilliseconds以整数精度返回值。无论如何,GetMilliseconds的实现似乎非常不正确。 - stanleyxu2005
是的,我不理解 Milliseconds 属性!帮助文件也没有真正地帮助! - TridenT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接