Смущает использование TTimeSpan в Delphi 2010 - PullRequest
6 голосов
/ 22 мая 2010

Я попробовал новый тип записи TTimeSpan в Delphi 2010. Но я поощряю очень странную проблему.

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

Это утверждение не проходит. Ожидается, что значение TTimeSpan.FromMilliseconds (5000) .Milliseconds будет равно 5000, но оно равно 0.

копаю глубже:

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 

Моя интерпретация кода верна, не так ли?

ОБНОВЛЕНИЕ: Метод GetTotalMilliseconds (двойная точность) реализован правильно.

Ответы [ 2 ]

7 голосов
/ 22 мая 2010

Вы путаете свойства, предоставляющие общую сумму, выраженную в данной единице , со свойствами, дающими часть значения, когда вы разбиваете его на составляющие (дни, часы , минуты, секунды, миллисекунды, тики).

С ними вы получаете целочисленный остаток для каждой категории. Таким образом, Milliseconds всегда будет между 0 и 999 (количество миллисекунд в секунду - 1).
Или другой пример: если у вас 72 минуты, TotalMinutes равно 72, но Minutes равно 12 .

Это очень похоже на функцию DecodeDateTime, чтобы разбить TDateTime.

И для того, чего вы хотите достичь, вам определенно нужно использовать свойство TotalMilliseconds, как указывал TridenT, но код для GetMilliseconds действительно верен в TimeSpan.

3 голосов
/ 22 мая 2010

Вы должны использовать TotalMilliseconds вместо Milliseconds свойство.

Работает лучше!

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

Из документации:

TotalMilliseconds Double
Timespan выражается в миллисекундах и часть миллисекунд

...