Путаница использования TTimeSpan в Delphi 2010

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

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

Это утверждение не проходит. Значение ' TTimeSpan.FromMilliseconds (5000).Ожидается, что миллисекунды будут 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 

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

UPDATE: метод GetTotalMilliseconds (двойная точность) реализован правильно.

2 ответов


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

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

очень много аналогично разрыв TDateTime.

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


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

Он работает лучше !

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

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

TotalMilliseconds Double
Промежуток времени, выраженный в миллисекундах и часть миллисекунд