Как получить правильную измененную дату и время файла FAT32 независимо от часового пояса в .NET?

Пожалуйста, прочтите этот вопрос полностью и внимательно, прежде чем отвечать. Ответ не так прост, как может показаться.

Я пишу программу, которая должна отслеживать дату и время изменения файлов, некоторые из которых хранятся на внешнем диске 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"));

Часовой пояс системы — Новая Зеландия, а системная дата — 9 апреля 2012 г., что соответствует стандартному времени Новой Зеландии.

C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test1\Test.txt
2012-04-09 3:53:46 pm Standard
20120409 03 5316

Теперь установите системную дату на 1 марта 2012 г., что соответствует летнему времени Новой Зеландии. Обратите внимание, что я переименовал каталог, содержащий тестовый файл. Это важно, поскольку в противном случае Windows будет кэшировать измененную дату и времяфайла. Я потратил много времени, прежде чем понял это.

C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test2\Test.txt
2012-03-01 3:54:13 pm Daylight
20120409 02 5316

Теперь установите системную дату на 9 апреля 2012 г. и измените часовой пояс на Аделаиду ​​(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, и если это летнее время, внести поправку на один час, но даже если бы я мог заставить это работать, это был бы ужасный уродливый взлом. Будет ли работать низкоуровневый системный вызов (я подозреваю, что проблема не на уровне ОС)? Могу ли я изменить часовой пояс процесса, не меняя его на всей машине? Есть ли другой способ?

9
задан TallGuy 9 April 2012 в 04:22
поделиться