2010-05-22 6 views
6

Ich habe versucht, den neuen Record-Typ TTimeSpan in Delphi 2010. Aber ich ermutige ein sehr seltsames Problem.Confusion von TTimeSpan Verwendung in Delphi 2010

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

Diese Behauptung wird nicht bestanden. Der Wert von 'TTimeSpan.FromMilliseconds (5000) .Milliseconds' wird voraussichtlich 5000 sein, aber es war 0.

ich tiefer graben:

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 

Mein Code Interpretation korrekt ist, ist es nicht?

UPDATE: Die Methode GetTotalMilliseconds (doppelte Genauigkeit) ist korrekt implementiert.

Antwort

7

Sie sind verwirrend die Eigenschaften die Gesamtmenge in einer bestimmten Einheit ausgedrückt geben mit den Eigenschaften geben den Teil eines Wertes, wenn Sie Zerlegen Sie es in seine Komponenten (Tage, Stunden, Minuten, Sekunden, Millisekunden, Ticks).

Mit diesen erhalten Sie den ganzzahligen Rest für jede Kategorie. So wird Milliseconds immer zwischen 0 und 999 (Anzahl der Millisekunden pro Sekunde - 1) sein.
Oder ein anderes Beispiel, wenn Sie 72 Minuten haben, ist TotalMinutes 72, aber Minutes ist 12.

Es ist sehr viel ähnlich der DecodeDateTime Funktion ein TDateTime aufzubrechen.

Und für was Sie erreichen möchten, müssen Sie auf jeden Fall die TotalMilliseconds Eigenschaft verwenden, wie TridenT wies darauf hin, aber der Code für GetMilliseconds ist in der Tat richtig in TimeSpan.

+0

Danke Francois, jetzt verstehe ich die Logik. – stanleyxu2005

3

Sie müssen TotalMilliseconds statt Milliseconds Eigenschaft verwenden.

Es funktioniert besser!

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

Aus Dokumentation:

TotalMilliseconds Doppel
Zeitspanne ausgedrückt in Millisekunden und Teil Millisekunden

+0

Hey Dude, Danke, das funktioniert! Das falsche Ergebnis von Millisekunden hat mich verwirrt. IMO, TTimeSpan ist ein unveränderlicher Datentyp, daher sollte jede Änderung eine neue Instanz zurückgeben. Ich denke, GetTotalMilliseconds gibt einen Wert mit doppelter Genauigkeit zurück und GetMilliseconds gibt einen Wert mit ganzzahliger Genauigkeit zurück. Jedenfalls scheint die Implementierung von GetMilliseconds sehr falsch zu sein. – stanleyxu2005

+0

Ja, ich verstehe die Eigenschaft 'Milliseconds' nicht! Und die Hilfedatei tut nicht wirklich ... gut ... hilft! – TridenT