delphidelphi-2010recordtimespan

Confusing of TTimeSpan usage in Delphi 2010


I tried the new Record type TTimeSpan in Delphi 2010. But I encountered a very strange problem.

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

This assertion does not pass. The value of 'TTimeSpan.FromMilliseconds(5000).Milliseconds' is expected to be 5000, but it was 0.

I dig deeper:

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 

My code interpretation is correct, isn't it?

UPDATE: The method GetTotalMilliseconds (double precision) is implemented correctly.


Solution

  • You are confusing the properties giving the total amount expressed in a given unit with the properties giving the portion of a value when you break it up into its components (days, hours, minutes, seconds, milliseconds, ticks).

    With those, you get the integer remainder for each category. So, Milliseconds will always be between 0 and 999 (Number Of Milliseconds Per Second - 1).
    Or, another example, if you have 72 minutes, TotalMinutes is 72, but Minutes is 12.

    It is very much similar to the DecodeDateTime function to break up a TDateTime.

    And for what you want to achieve, you definitely need to use the TotalMilliseconds property, as TridenT pointed out, but the code for GetMilliseconds is indeed correct in TimeSpan.