ToFileTimeFromFileTimeメソッドは、日時の値をWindowsのファイルタイムスタンプで使われるlong型(64ビット)の値に変換します。

タイムスタンプはUTCでの時刻とされているため、ToFileTimeメソッドではUTCに変換された上での値が返されます。 FromFileTimeメソッドでこの値を変換すると、UTCからローカル時刻に変換された(KindプロパティがDateTimeKind.Localの)DateTimeが返されます。 一方、FromFileTimeUtcメソッドで変換すると、UTC(KindプロパティがDateTimeKind.Utc)のDateTimeが返されます。

DateTimeOffset.FromFileTimeメソッドでは、返されるDateTimeOffsetのOffsetプロパティには常にローカル時刻のオフセットが設定されます。

DateTime.ToFileTime/FromFileTimeメソッドで日時⇄ファイルタイムスタンプ値の変換をする
Imports System

Class Sample
  Shared Sub Main()
    Dim dt As DateTime = DateTime.Now
    Dim ts As Long = dt.ToFileTime() ' DateTimeをファイルタイムスタンプの値に変換

    Console.WriteLine("{0:o} -> {1}", dt, ts)
    Console.WriteLine("{0} -> {1:o}", ts, DateTime.FromFileTime(ts))     ' ファイルタイムスタンプの値をローカル時刻のDateTimeに変換
    Console.WriteLine("{0} -> {1:o}", ts, DateTime.FromFileTimeUtc(ts))  ' ファイルタイムスタンプの値をUTCのDateTimeに変換
    Console.WriteLine()

    Dim dto As DateTimeOffset = DateTimeOffset.Now
    ts = dto.ToFileTime() ' DateTimeOffsetをファイルタイムスタンプの値に変換

    Console.WriteLine("{0} -> {1}", dto, ts)
    Console.WriteLine("{0} -> {1}", ts, DateTimeOffset.FromFileTime(ts)) ' ファイルタイムスタンプの値をDateTimeOffsetに変換
  End Sub
End Class
実行結果例
2013-04-01T15:00:30.1230000+09:00 -> 130092696301230000
130092696301230000 -> 2013-04-01T15:00:30.1230000+09:00
130092696301230000 -> 2013-04-01T06:00:30.1230000Z

2013/04/01 15:00:30 +09:00 -> 130092696301230000
130092696301230000 -> 2013/04/01 15:00:30 +09:00

なお、File.SetLastWriteTimeなどFileクラスのタイムスタンプを設定・取得を行うメソッドでは、引数の型がDateTimeとなっています。 そのため、これらのメソッドを使ってタイムスタンプを変更する場合は、わざわざToFileTime・FromFileTimeメソッドを使って値の変換を必要はありません。

ファイルタイムスタンプで表現できる最小(最古)の日時は1601年01月01日 00:00:00(UTC)でありDateTimeで扱える範囲よりも狭いため、その範囲を越える値を変換しようとした場合はArgumentOutOfRangeExceptionがスローされます。

MENTAにてテキストチャットによるサポートを行っています。 問題の解決法をお探しの方や.NET/C#を学習中の方はどうぞご利用ください。