C# 中缓存的正确时间戳



我正在创建网络文件系统的内存本地缓存。

我希望每个目录/文件都具有LastDownloadedTime属性,然后将其与当前时间进行比较,以确定目录/文件是否太旧而无法从缓存中使用。

但我不确定DateTime.Now()是否是我需要的。如果用户更改系统时间,会发生什么情况?如何在 .NET 中获得适合我的任务的模拟?

看看System.DateTime.UTCNow() . 它将返回 UTC 时间。 只需确保您始终在两端调用(当您存储缓存以及测试缓存是否过期时)。

更多信息: https://msdn.microsoft.com/en-us/library/system.datetime.utcnow(v=vs.110).aspx

你应该使用DateTimeOffset .根据文档:

唯一且明确地标识单个时间点。DateTimeOffset 类型可用于明确定义"now"的含义、记录事务时间、记录系统或应用程序事件的时间以及记录文件创建和修改时间。

但是,如果您的应用程序在用户的计算机上运行,他们可以更改其系统时间(如您所提到的)。防止这种情况的唯一方法是让您的应用程序 ping 时间服务器以获取权威时间戳。

我想

我会使用 Stopwatch 作为时间戳,因为我的文件系统缓存在内存中,它无法在系统重新启动后幸存下来。时间戳将相对于Stopwatch的开始。

不过,众所周知,Stopwatch是有缺陷的。

但我认为依赖于系统时钟的解决方案更加危险,因为用户可能会将系统时钟设置为过去的某个日期,从而搞砸一切。

如果您停留在本地服务器的范围内,那么DateTime.UtcNow是该任务最方便的选项。是的,如果用户更改本地时间,则将使缓存失效并触发不必要的更新。

您将需要使用 NTP(时间)服务器来避免该问题。因此,您将从NTP服务器获取UTC时间,而不是使用本地服务器UTC时间(世界上有很多可用的UTC时间)。

请参考NTP维基百科文章

最新更新