ToFileTime・FromFileTimeメソッドは、日時の値を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がスローされます。