2010-05-22 66 views
6

我在Delphi 2010中嘗試了新的記錄類型TTimeSpan,但我鼓勵一個非常奇怪的問題。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(雙精度)正確實現。

回答

7

你感到困惑的屬性給在給定的單位表達總量當你擁有屬性值的部分將其分解成組件(天,小時,分鐘,秒,毫秒,滴答聲)。

用這些,你會得到每個類別的整數餘數。因此,Milliseconds將始終在0和999之間(毫秒數/秒 - 1)。或者,另一個例子,如果你有72分鐘,TotalMinutes是72,但是Minutes是12

這是非常多的類似於DecodeDateTime功能打破TDateTime

爲了達到目的,您必須使用TotalMilliseconds屬性,正如TridenT指出的那樣,但GetMilliseconds的代碼在TimeSpan中確實是正確的。

+0

謝謝弗朗索瓦,現在我明白了邏輯。 – stanleyxu2005 2010-05-22 18:23:51

3

您必須使用TotalMilliseconds而不是Milliseconds屬性。

它效果更好!

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

從技術文檔:

TotalMilliseconds雙
時間跨度表現爲毫秒, 部分毫秒

+0

嘿,夥計,謝謝,這個作品! 毫秒的錯誤結果確實讓我困惑。 IMO,TTimeSpan是一個不可變的數據類型,所以任何修改都應該返回一個新的實例。 我想,GetTotalMilliseconds以雙精度返回一個值,GetMilliseconds以整數精度返回一個值。無論如何,GetMilliseconds的實現似乎是非常不正確的。 – stanleyxu2005 2010-05-22 09:26:06

+0

是的,我不明白'毫秒'屬性!幫助文件並不真的......呃......幫助! – TridenT 2010-05-22 10:15:32