日時

FILETIME変換バイト順と属性の意味を確かめる

Windows FILETIMEを小数点以下7桁のUTC日時へ。入力形式とLDAP属性を指定してから、数値の意味を確認してください。

FILETIME変換

入力

入力はこのブラウザー内で処理され、サーバーには送信されません。

結果

オプション

Windowsの起点:1601-01-01 UTC・1tick = 100ns。

1行に1値。上位・下位はhigh,low(10進数または0x付き、符号付き10進ワードも可)。バイトは16桁または8組。日時はYYYY-MM-DDTHH:mm:ss[.1~7桁]Zまたは±HH:mm。拡張年は+YYYYYY。

バイト順はバイト入力だけに適用します。実際のAD属性を選んでください。10進数の-1はpwdLastSetの制御値としてのみ受け付けます。

UTC日時は小数点以下7桁。Unixの商は切り下げ、余りは100nsのtick単位です。

最大1,000物理行、100,000 UTF-16コード単位。両端の空白を除去し、空行はエラーにします。

入力するかサンプルを読み込んでください。

測定機器やWindows APIが返すFILETIME構造体を読むとき、FILETIME変換で上位・下位ワードと日時を照合できます。ミリ秒だけを表示するビューアーでは見えない、最後の100ナノ秒も残ります。

同じゼロでも、一般的なファイル時刻なら1601年の起点、accountExpiresなら期限なし、lastLogonなら不明です。整数だけでは属性を識別できないため、元のフィールドを確認して選びます。

FILETIME変換で確認できること

バイト列の並びをそのまま比較

FILETIME変換は整数の16進表示と、8バイトの大小エンディアン表示を別々に出力します。既に数値として読んだ16進数を、メモリ上のバイト列と誤解してもう一度反転するミスを防げます。

色分けした八つのバイトが逆順になり、一つの六十四ビット値の上位と下位を示す図。

属性が違えばゼロの結果も変わる

一般モードのゼロはUTC日時になります。accountExpiresのゼロは期限なし、lastLogonのゼロは時刻不明として表示し、特殊状態に架空の日時やUnix時間を付けません。

同じゼロから日付、無期限、時刻不明の三つの記号へ分岐する図。

生バイトと整数を区別する

01

ダンプの読み方に合わせる

8バイト形式では連続した16桁の16進数、または空白区切りの8組を入力します。上位・下位はhigh,lowの順です。C構造体の宣言順が下位からでも、ここでは上位を先に記述します。

02

日時にはオフセットを書く

逆変換はZまたは±HH:mmが必須です。パソコンの設定がUTCでも省略できません。例は現在の方向と形式に合わせて作られ、置換内容を確認して適用すると入力が変わります。

03

特殊状態がないことを確認する

自動変換は編集後350ms待って実行します。無効にすると変換ボタンとCtrl/Cmd+Enterが使えます。逆方向への置換は全行が日時の場合だけ可能で、取り消すと入力と結果が同時に戻ります。

細かい時刻を保ったまま照合

100ナノ秒単位で往復

116444736000000001は1970-01-01T00:00:00.0000001Zです。大きな整数を文字列として保持し、日時を小数点以下7桁で出すため、最後の1tickも逆変換で復元できます。

符号付きCOMワードにも対応

上位・下位には32ビット符号付き10進数と符号なしDWORDを使用できます。負のワードは2の補数として解釈し、両方の表記を報告します。この扱いを負のFILETIME全体へ拡張しません。

Unix時間の余りも残す

1601年と1970年の差を引いてから秒・ミリ秒へ変換します。商は負の方向へ切り下げ、余りは非負のtick数で出力します。1970年直前の細かい時刻もゼロへ丸められません。

各行の原文と診断を保持

一括入力は最大1,000行です。不正な行を残したまま他の行を処理し、最初は50行だけ表示します。コピーとJSON保存には、非表示の行を含むすべての結果とエラーが入ります。

受け付ける形式と解釈の範囲

保存できる値と日時の範囲は別
符号なし64ビットの最大値18446744073709551615まで読み取れます。ただし9223372036854775807を超える値はWin32の日時変換範囲外として扱い、ビット表現だけを残します。一般モードの上限日時は拡張年表記です。
ADの状態を断定しない
accountExpiresのゼロと最大符号付き整数は期限なしです。pwdLastSet=0の意味にはUF_DONT_EXPIRE_PASSWDの確認が必要で、10進数の-1は書き込み制御値です。lastLogon=0だけで未ログインと断定できません。
厳密な日時だけを受け付ける
秒と明示的なZまたは±HH:mmが必要で、オフセットは±14:00以内です。9999年を超える年は+YYYYYYを使います。不正な日、うるう秒、24:00、-00:00、8桁以上の小数は補正せずエラーにします。
形式は自動推測しない
10進数、整数の16進数、8バイト、high,lowを明示的に選びます。指数表記や桁区切りは受け付けません。行の両端の空白は除去しますが、空行はエラーとして残します。短い整数も有効な場合があります。
元ファイルやディレクトリは操作しない
MFTやレジストリの解析、ファイル時刻の書き換え、LDAP接続、アカウント監査は行いません。GeneralizedTime、.NET ticks、Excel日付、時間の加減算は別の処理です。取得元の時計の精度を高めることもできません。
入力上限と置換の取り消し
上限は100,000 UTF-16コード単位と1,000物理行です。超えた場合は一括処理全体を拒否します。例、クリア、逆方向の適用前に置換量を示し、その後一度取り消せます。続けて編集すると古い復元履歴は消えます。

FILETIME変換の疑問

Windows FILETIMEとは何ですか?

Windows FILETIMEは1601-01-01 UTCからの100ナノ秒間隔数です。FILETIME構造体では下位と上位の32ビットに分かれています。数値自体にLDAP属性名や利用目的は含まれません。

FILETIMEの起点はなぜ1601年なのですか?

グレゴリオ暦の400年周期に合わせたWindowsの設計上の起点です。Unixの1970年とは異なるため、単に10000000で割った値をUnix秒として扱うと年代がずれます。

FILETIME構造体に入った日時を読み取るにはどうすればよいですか?

構造体のdwHighDateTimeとdwLowDateTimeを確認し、この画面ではhigh,lowの順に入力します。生の8バイトを取り出した場合はバイト形式を使い、数値として読んだワードと混同しないでください。

FILETIMEの時刻を数時間ずらすにはどうすればよいですか?

1時間は36000000000tickです。ただし表示時差を直したいだけなら元の瞬間に時間を足すべきではありません。本ツールに加減算ボタンはなく、日時の明示的なオフセットでUTCへの対応を確認します。

ファイルの作成日時が別のタイムゾーンで期待どおりに表示されないのはなぜですか?

NTFSはUTCを記録しますが、FATのディスク上の時刻はローカル時刻で、取得方法や夏時間設定も影響します。このページは抽出済みのFILETIMEをUTCへ変換します。元ファイルの表示規則までは推測しません。

予想と違う結果ですか?

元の記録と一緒に保存する

FILETIME変換のレポートを元データと一緒に保存すると、採用した属性、バイト順、残った小数精度を後から確認できます。