2010-05-22 22 views
6

Ho provato il nuovo tipo di record TTimeSpan in Delphi 2010. Ma incoraggio un problema molto strano.Confusione dell'uso di TTimeSpan in Delphi 2010

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

Questa affermazione non supera. Il valore di 'TTimeSpan.FromMilliseconds (5000) .Milliseconds' dovrebbe essere 5000, ma era 0.

I scavare più in profondità:

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 

La mia interpretazione codice è corretto, non è vero?

UPDATE: il metodo GetTotalMilliseconds (doppia precisione) è implementato correttamente.

risposta

7

Stai confondendo le loro proprietà, la quantità totale espressa in una data unità con le proprietà che danno la parte di un valore quando si suddividerlo nei suoi componenti (giorni, ore, minuti, secondi, millisecondi, zecche).

Con questi, si ottiene il resto intero per ogni categoria. Quindi, Milliseconds sarà sempre compreso tra 0 e 999 (numero di millisecondi al secondo - 1).
Oppure, un altro esempio, se si dispone di 72 minuti, TotalMinutes è 72, ma Minutes è 12.

È molto simile alla funzione DecodeDateTime per interrompere uno TDateTime.

E per quello che si vuole raggiungere, è sicuramente bisogno di utilizzare la proprietà TotalMilliseconds, come ha sottolineato il tridente, ma il codice per GetMilliseconds è infatti corretto in TimeSpan.

+0

Grazie Francois, ora capisco la logica. – stanleyxu2005

3

È necessario utilizzare TotalMilliseconds anziché Milliseconds proprietà.

Funziona meglio!

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

Da documentazione:

TotalMilliseconds doppio
Timespan espresso in millisecondi e millisecondi parte

+0

Ehi amico, grazie, funziona! Il risultato errato di Milliseconds mi ha confuso. IMO, TTimeSpan è un tipo di dati immutabile, quindi qualsiasi modifica dovrebbe restituire una nuova istanza. Suppongo che GetTotalMilliseconds restituisca un valore con precisione doppia e GetMilliseconds restituisca un valore con precisione integer. Ad ogni modo l'implementazione di GetMilliseconds sembra essere molto scorretta. – stanleyxu2005

+0

Sì, non capisco la proprietà 'Milliseconds'! E il file di aiuto in realtà non ... beh ... aiuta! – TridenT

Problemi correlati