C# 日期时间比较和夏令时/其他奇怪之处

C# 日期时间比较和夏令时/其他奇怪之处,c#,.net,datetime,dst,C#,.net,Datetime,Dst,我对datetimes有一个非常简单的需求,我需要能够比较2个文件的修改时间,我不需要任何其他信息,除了上次更新的文件/它们是否相同 我想知道在夏时制之后,日期时间比较(我不关心其他任何事情)会有什么反应 假设您在时间X更改了一个文件,然后又在时间Y30分钟后更改了一个文件(但时钟实际上显示时间提前了30分钟,因为日期因节省而更改) 如果X和Y是2个日期时间,会发生什么?是X>Y还是Y>X?它会比较显示的时间还是刻度数?(我应该做X>Y还是比较X.TicksvsY.Ticks?) 编辑:如果有人

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

我想知道在夏时制之后,日期时间比较(我不关心其他任何事情)会有什么反应

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

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


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

在.Net中,从文件中提取上次修改的日期/时间时,可以使用,其属性为
LastWriteTime
LastWriteTimeUtc
,也可以使用,其方法为
GetLastWriteTime()
GetLastWriteTimeUtc()

使用这些UTC格式,您根本不需要关心夏令时的更改

关于比较问题,您可以简单地比较
X>Y
DateTime
struct重写基于刻度进行比较的
Equals
方法。你可以在地图上看到这一点。但
DateTime
对象的刻度不一定基于UTC。
Kind
属性也起作用。如果您使用的是
DateTimeKind.Utc
,则可以进行比较,而不考虑时区或夏令时差异

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


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

您如何准确获取
DateTime
值?这有很大的不同。如果您的
DateTime
值的
类型为
Utc
,则可以。。。否则,您会遇到以下问题:(在这里查看Jon的网站@JonSkeet我关心DateTime。现在和FileInfo.LastWrite/Modified/other中的属性,不确定它们的种类,我自己也不做任何修改。此外,如果您要与当前时间进行比较,请确保使用
DateTime.UtcNow
作为比较点。另请参阅:我只是比较f。)但是,我将现在得到的日期与存储在DB中的日期进行比较(我将它们存储在刻度中),当从刻度重建日期以进行比较时,我应该做什么特别的事情?您是否基于UTC存储刻度?或者类似于
DateTime的东西。现在。刻度
?而且,大多数数据库都有DateTime数据类型,所以通常不需要存储刻度。我将使用您建议的属性(LastWriteTimeUtc)中的DateTime。但是,我不确定如果我传递一个datetime,EF会做什么。我将它存储在lucene索引中(因此不是一个真正的数据数据库),我真的更愿意将其视为一个原始数字,只是想知道我是否按照您的建议(var mydateticks=CurrentFile.LastWriteTimeUtc.Ticks)做,如何从mydateticks返回到原始datetime对象?(如何让datetime知道它需要重建utc datetime?)构造函数
datetime
例如,
new datetime(yourTicks,DateTimeKind.utc)