无论.NET中的时区如何,如何获得FAT32文件的正确修改日期时间?

Tal*_*Guy 9 .net c# timezone utc

请仔细阅读这个问题完全并认真回答了.答案并不像看起来那么简单.

我正在编写一个程序,需要跟踪文件的修改日期时间,其中一些存储在外部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"));
Run Code Online (Sandbox Code Playgroud)

系统时区为新西兰,系统日期为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
Run Code Online (Sandbox Code Playgroud)

现在将系统日期设置为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
Run Code Online (Sandbox Code Playgroud)

现在将系统日期设置回2012年4月9日,并将时区更改为阿德莱德(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
Run Code Online (Sandbox Code Playgroud)

那么如何才能获得正确的修改日期时间?我可以尝试找出文件是否在FAT32文件系统上,如果它是夏令时调整一小时,但即使我可以让它工作,这将是一个可怕的丑陋黑客.将使用低级系统调用工作(我怀疑不是因为问题似乎是在操作系统级别)?我可以在不更改整个机器的情况下更改过程的时区吗?还有其他方法吗?

Pet*_*lin 10

问题是,FAT32文件系统将文件时间存储为本地时间.因此,UTC时间是考虑DST的计算时间,这导致不同的UTC时间.一般来说,这个问题非常复杂,无法解决.

例如,您需要将实际的UTC文件修改时间存储在单独的文件中,在删除外部驱动器之前,必须在每台计算机上同步该文件.如果同步不会至少执行一次,那么它就不能被认为是正确的.并没有简单的方法来强制执行用户.

  • OMG非常糟糕(FAT32).谢谢(你的)信息. (7认同)
  • @TallGuy:FAT32系统以自*原始*IBM PC时代以来基本不变的格式存储目录条目.鉴于当时大多数微型计算机都没有任何精确的时钟,即使PC没有任何方法可以在断电时维持日期和时间,时区相关的功能也只会令人讨厌.大多数用户. (2认同)