我正在创建网络文件系统的内存本地缓存。
我希望每个目录/文件都具有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维基百科文章