6

Delphi 2010 で新しい Record タイプ TTimeSpan を試しましたが、非常に奇妙な問題が発生しました。

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 (倍精度) が正しく実装されています。

4

2 に答える 2

7

与えられた単位で表される合計量を与えるプロパティと、値をそのコンポーネント(日、時間、分、秒、ミリ秒、ティック)に 分割するときに値の一部を与えるプロパティとを混同しています。

これらを使用すると、各カテゴリの整数の余りが得られます。したがって、Milliseconds常に0から999(1秒あたりのミリ秒数-1)の間になります。
または、別の例では、72分ある場合、72ですTotalMinutesが、Minutes12です。

を分割する関数と非常によく似ていDecodeDateTimeTDateTimeます。

そして、あなたが達成したいことのために、TotalMillisecondsTridenTが指摘したように、あなたは間違いなくプロパティを使用する必要がありますが、のコードGetMillisecondsは確かに正しいですTimeSpan

于 2010-05-22T17:23:51.113 に答える
3

TotalMillisecondsプロパティの代わりに使用する必要がありMillisecondsます。

それはより良く機能します!

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

ドキュメントから:

TotalMilliseconds Double Timespan
は、ミリ秒とパート ミリ秒で表されます

于 2010-05-22T09:13:51.057 に答える