回答する前に、この質問をよく読んでください。答えは見かけほど単純ではありません。
ファイルの変更された日時を追跡する必要があるプログラムを作成しています。ファイルの一部は外部 FAT32 ドライブに保存されています。このプログラムは、さまざまな Windows 7 マシンで実行されています。
問題は、現在の UTC オフセットが変更されると、UTC 修正日時が変更されることです。具体的には、ニュージーランド標準時 (UTC+12) からニュージーランド夏時間 (UTC+13) に移動し、再び戻る場合です。これはタイプミスではありません - UTC修正日時が変更されます。それはUTCのポイントのようなものですが、そうすべきではありません。これは FAT32 ファイル システムの制限のようです - NTFS 上のファイルは正常に動作します。
Console.WriteLine(DateTime.Now.ToString() + (DateTime.Now.IsDaylightSavingTime() ? " Daylight" : " Standard"));
Console.WriteLine(new FileInfo(args[0]).LastWriteTimeUtc.ToString("yyyyMMdd HH mmss"));
システムのタイムゾーンはニュージーランドで、システムの日付はニュージーランド標準時である 2012 年 4 月 9 日です。
C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test1\Test.txt
2012-04-09 3:53:46 pm Standard
20120409 03 5316
システムの日付をニュージーランドの夏時間である 2012 年 3 月 1 日に設定します。テスト ファイルを含むディレクトリの名前を変更したことに注意してください。そうしないと、 Windows がファイルの変更された日時をキャッシュするため、これは重要です。私はそれを理解するまでに多くの時間を無駄にしました。
C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test2\Test.txt
2012-03-01 3:54:13 pm Daylight
20120409 02 5316
システムの日付を 2012 年 4 月 9 日に戻し、タイムゾーンを Adelaide (UTC+09:30) に変更します。
C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test3\Test.txt
2012-04-09 1:27:21 pm Standard
20120409 06 2316
では、どうすれば正しい変更日時を取得できますか? ファイルが FAT32 ファイル システム上にあるかどうか、夏時間の場合は 1 時間の調整を行うことができますが、それを機能させることができたとしても、それは恐ろしい醜いハックになるでしょう。低レベルのシステム コールを使用しても機能しますか (問題が OS レベルにあると思われるため、そうではないと思います)。マシン全体で変更せずに、プロセスのタイムゾーンを変更できますか? 他に方法はありますか?