DateTime比较和夏令时/其他怪异

时间:2014-04-12 17:53:42

标签: c# .net datetime dst

我对日期时间有一个非常简单的需求,我需要能够比较2个文件的修改时间,我不需要任何其他信息,除了哪一个上次更新/它们是相同的。

我想知道在夏令时后,datetime COMPARISON(我不关心其他任何事情)会有什么反应。

让我们假设您在X时间更改文件,然后在30分钟后再次在时间Y更改文件(但时间实际上显示30分钟更早,因为由于节省而更改了日期)。

如果X& Y是2个日期时间,会发生什么?是X > Y还是Y > X?它是否比较显示的时间或滴答数? (我应该X > Y还是应该X.TicksY.Ticks进行比较?)

编辑:如果有人好奇,用例是我连续索引文件(多年),其中一些可能很少变化,我跳过的任何内容都不比索引时更新因此,如果我错过了一个,它可能需要很长时间再次更改并在索引中更新。

1 个答案:

答案 0 :(得分:6)

在.Net中,当您从文件中提取上次修改日期/时间时,您可以使用FileInfo class,其中包含LastWriteTimeLastWriteTimeUtc等属性,或者您可以使用File class,其中包含GetLastWriteTime()GetLastWriteTimeUtc()等方法。

使用这些的UTC形式,您根本不需要关注夏令时的变化。

关于比较问题,您只需比较X > Y即可。 DateTime结构覆盖基于tick的Equals方法进行比较。您可以在.NET Framework Reference Source中看到这一点。但是DateTime对象的刻度不一定基于UTC。 Kind属性也发挥作用。如果您使用DateTimeKind.Utc,那么您可以进行比较而不考虑时区或夏令时差异。

请记住,当操作系统从文件系统检索上次修改时间时,它会受到文件系统的行为的影响。当NTFS记录所有UTC时间时,其他文件系统(如FAT和FAT32)在本地时间中记录文件时间。这会影响您始终检索文件修改日期的能力。

因此,如果您在讨论NTFS卷上的文件时间,那么您没问题。但是,如果你在谈论FAT32卷上的文件时间(可能来自USB拇指驱动器或相机的SD卡),那么你无法保证准确的转换。这是使用exFAT而不是FAT32格式化SD卡的一个很好的理由,因为exFAT包含时区偏移,可以准确地转换回UTC。