10

回答する前に、この質問をよく読んでください。答えは見かけほど単純ではありません。

ファイルの変更された日時を追跡する必要があるプログラムを作成しています。ファイルの一部は外部 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 レベルにあると思われるため、そうではないと思います)。マシン全体で変更せずに、プロセスのタイムゾーンを変更できますか? 他に方法はありますか?

4

1 に答える 1

11

問題は、FAT32 ファイルシステムがファイル時間をローカル時間として保存することです。したがって、UTC 時間は DST を考慮して計算された時間であり、異なる UTC 時間になります。一般に、この問題は非常に複雑で、解決できません。

たとえば、実際の UTC ファイルの変更時刻を別のファイルに保存する必要があります。これは、外部ドライブを取り外す前に各マシンで同期する必要があります。同期が少なくとも 1 回実行されない場合、それは正しいとは見なされません。そして、それをユーザーに強制する簡単な方法はありません。

于 2012-04-09T06:46:16.800 に答える