2010-05-22 7 views
6

Probé el nuevo tipo de registro TTimeSpan en Delphi 2010. Pero sugiero un problema muy extraño.Confusión del uso de TTimeSpan en Delphi 2010

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

Esta afirmación no pasa. Se espera que el valor de 'TTimeSpan.FromMilliseconds (5000) .Milliseconds' a ser 5000, pero fue 0.

cavo más profundo:

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 

Mi interpretación código es correcto, ¿verdad?

ACTUALIZACIÓN: El método GetTotalMilliseconds (precisión doble) se implementa correctamente.

Respuesta

7

Usted está confundiendo las propiedades permitan la cantidad total expresada en una unidad determinada con las propiedades que dan la parte de un valor cuando descomponerlo en sus componentes (días, horas, minutos, segundos, milisegundos, tics).

Con eso, obtienes el resto del número entero para cada categoría. Por lo tanto, Milliseconds siempre estará entre 0 y 999 (Número de milisegundos por segundo - 1).
O, otro ejemplo, si tiene 72 minutos, TotalMinutes es 72, pero Minutes es 12.

Es mucho similar a la función DecodeDateTime para descomponer TDateTime.

Y para lo que quiere lograr, definitivamente necesita utilizar la propiedad TotalMilliseconds, como TridenT señaló, pero el código para GetMilliseconds es correcto en TimeSpan.

+0

Gracias Francois, ahora entiendo la lógica. – stanleyxu2005

3

Debe utilizar TotalMilliseconds en lugar de la propiedad Milliseconds.

¡Funciona mejor!

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

De la documentación:

TotalMilliseconds doble
Timespan expresa como milésimas de segundo y milisegundos parte

+0

¡Hola amigo, gracias, esto funciona! El resultado incorrecto de Milliseconds me ha confundido. IMO, TTimeSpan es un tipo de datos inmutables, por lo que cualquier modificación debe devolver una nueva instancia. Supongo que GetTotalMilliseconds devuelve un valor con doble precisión y GetMilliseconds devuelve un valor de precisión entera. De todos modos, la implementación de GetMilliseconds parece ser muy incorrecta. – stanleyxu2005

+0

Sí, no entiendo la propiedad 'Milliseconds' Y el archivo de ayuda realmente no ... bueno ... ¡ayuda! – TridenT