views:

217

answers:

2

Hi All,

I tried the new Record type TTimeSpan in Delphi 2010. But I encourage 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.

+2  A: 

You must use TotalMilliseconds instead of Milliseconds property.

It works better !

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

From documentation:

TotalMilliseconds Double
Timespan expressed as milliseconds and part milliseconds

TridenT
Hey Dude, Thanks, this works! The wrong result of Milliseconds does have confused me. IMO, TTimeSpan is an immutable data type, so any modification should return a new Instance. I suppose, GetTotalMilliseconds returns a value at double precision and GetMilliseconds returns a value at integer precision. Anyway the implementation of GetMilliseconds seems to be very much incorrect.
stanleyxu2005
Yeah, I don't understand the `Milliseconds` property ! And the help file doesn't really .. well ... helps !
TridenT
+4  A: 

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.

François
Thanks Francois, now I understand the logic.
stanleyxu2005