如何获取 FAT32 文件的正确修改日期时间,而不考虑 .NET 中的时区

本文关键字:时间 日期 不考虑 时区 NET 修改 何获取 获取 文件 FAT32 | 更新日期: 2023-09-27 18:30:23

在回答之前,请仔细阅读这个问题。答案并不像看起来那么简单。

我正在编写一个程序,需要跟踪文件的修改日期时间,其中一些存储在外部 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 日,并将时区更改为阿德莱德 (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 文件系统上,如果是夏令时,请进行调整一小时,但即使我能让它工作,那也将是一个可怕的丑陋黑客。使用低级系统调用是否有效(我怀疑不是因为问题似乎出在操作系统级别)?我可以更改进程的时区,而不在整个机器上更改它吗?还有其他办法吗?

如何获取 FAT32 文件的正确修改日期时间,而不考虑 .NET 中的时区

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

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