【问题标题】:DateTime comparison and daylight saving / other oddities日期时间比较和夏令时/其他奇怪的东西
【发布时间】:2014-05-26 21:00:53
【问题描述】:

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

我想知道日期时间比较(我不关心其他任何事情)在夏令时后有何反应。

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

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

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

【问题讨论】:

  • 您如何准确获取DateTime 值?它制造了巨大的差异。如果您的 DateTime 值具有 KindUtc,那么您很好......否则,您会遇到问题 :(
  • @JonSkeet 我关心 DateTime.Now 和 FileInfo.LastWrite/Modifed/other 中的属性,不确定它们的种类,我自己没有对所述日期进行任何修改。

标签: c# .net datetime dst


【解决方案1】:

在 .Net 中,当您从文件中提取最后修改的日期/时间时,您可以使用具有 LastWriteTimeLastWriteTimeUtc 等属性的 FileInfo class,也可以使用 @987654322 @,有GetLastWriteTime()GetLastWriteTimeUtc()等方法。

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

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

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

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

【讨论】:

  • 另外,如果您要与当前时间进行比较,请务必使用DateTime.UtcNow 作为比较点。另见:The Case Against DateTime.Now
  • 我只是比较文件,但是我比较的是我现在得到的日期和我存储在数据库中的日期(我将它们存储在刻度中),在重建日期时我应该做的任何特别的事情要比较的刻度?
  • 您是否根据 UTC 存储刻度?或者类似DateTime.Now.Ticks 的东西?此外,大多数数据库都有日期时间数据类型,因此通常不需要存储刻度。
  • 我将使用您建议的属性中的日期时间 (LastWriteTimeUtc)。但是,如果我将日期时间传递给 EF,我不确定它会做什么。我将它存储在一个 lucene 索引中(所以不是一个真正的数据数据库),我真的宁愿把它当作一个原始数字,只是想知道我是否按照你的建议做(var mydateticks = CurrentFile.LastWriteTimeUtc.Ticks)如何我要从 mydateticks 回到原来的 datetime 对象吗? (我如何让 datetime 知道它需要重建一个 utc 日期时间?)
  • DateTime 构造函数has an overload that takes ticks and a kind。例如,new DateTime(yourTicks, DateTimeKind.Utc)
猜你喜欢
  • 2011-01-27
  • 1970-01-01
  • 2012-07-09
  • 2012-04-07
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
相关资源
最近更新 更多