TOPページへ戻る  PCページへ戻る  一覧へ戻る

TFILETIME(_FILETIME)の演算

TFILETIMEはWindowsでファイルの日付を管理するのに使用される型で、Windowsでは_FILETIME構造体として定義されています。_FILETIME構造体は、32ビットの整数を2つメンバに持ち、1601年1月1日からの時間を100ナノ秒単位で記録します。素直に64ビット整数を使えばいいのでしょうが、古いWindowsでは64ビット整数を扱えなかったためにこのような構造体を用いていると思われます。


_FILETIME構造体の2つのメンバは、1601年1月1日からの時間を100ナノ秒単位で表した整数の上位32ビットと下位32ビットとなります。即ち、1601年1月1日からの時間を100ナノ秒単位で表した整数を64ビット整数として扱い、32ビット整数型で値を保持するために、上位32ビットと下位32ビットに分けて保持します。上位32ビットはdwHighDateTime、下位32ビットはdwLowDateTimeという名称です。例えば、1970年5月20日1時6分30秒は次のようになります。

経過時間(ナノ秒)= 116564547900000000(10進数)。下は2進数64ビットで表記したもの。

上のことから、1970年5月20日1時6分30秒に5時間を加えるような場合、_FILETIME構造体を64ビットの整数で表したものに180000000000(=5時間をナノ秒で表した整数)を加えれば良いことが分かります。即ち、下のようなコードになります。但し、変数はftは_FILETIME形の変数で1970年5月20日1時6分30秒という値を初期に保持し、itは64ビット整数型の変数です。


it := (Int64(ft.dwHighDataTime) shl 32) + dwLowDataTime + 180000000000;
ft.dwHighDataTime := it shr 32;
ft.dwLowDataTime := it and $FFFFFFFF

コードの説明

最初の行が_FILETIMEの演算になります。shl演算子は、整数のビットを指定した数だけ左にシフトします。例えば、10 shl 3ならば、整数10の2進数は1010なので1010000となり、演算結果は整数80になります。shl演算子は、演算結果が引数の型と同じになること、あふれたビットは値を失うことに注意が必要です。dwHighDataTimeは32ビット整数型ですので、shl演算子で単に32ビット左にシフトするとdwHighDataTimeの32ビット全てが0になってしまいます。そのため、shl演算子の前にInt64型でキャストする必要があります。

2行目は変数ftのdwHighDataTimeに加算結果の上位32ビットを代入しています。shr演算子は整数のビットを指定した数だけ右へシフトします。例えば、10 shr 3ならば、整数10の2進数は1010なので0001となり、演算結果は整数1になります。

3行目は変数ftのdwLowDataTimeに演算結果の下位32ビットを代入しています。$FFFFFFFFは32ビット整数では全ビットが1です。64ビット整数の場合、上位32ビットは全て0、下位32ビットが全て1となります。64ビット整数の変数itと$FFFFFFFFの論理積(and)を取ることにより、下位32ビットだけを抽出することができます。

TOPページへ戻る  PCページへ戻る  一覧へ戻る