繁体   English   中英

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

[英]How do I get the correct modified datetime of a FAT32 file, regardless of timezone in .NET?

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

我正在编写一个程序,需要跟踪文件的修改日期时间,其中一些文件存储在外部 FAT32 驱动器上。 该程序正在各种 Windows 7 机器上运行。

问题是当前 UTC 偏移量更改时 UTC 修改日期时间更改。 具体来说,当我们 go 从新西兰标准时间 (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 文件系统将文件时间存储为本地时间 因此,UTC 时间是将 DST 考虑在内的计算时间,这会导致不同的 UTC 时间。 一般来说,这个问题非常复杂,无法解决。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM