Путаница использования 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
Промежуток времени, выраженный в миллисекундах и часть миллисекунд