【发布时间】:2016-06-07 23:18:54
【问题描述】:
我正在创建网络文件系统的内存本地缓存。
我希望每个目录/文件都具有LastDownloadedTime 属性,然后将其与当前时间进行比较以确定目录/文件是否太旧而无法从缓存中使用。
但我不确定DateTime.Now() 是否是我需要的。如果用户更改系统时间会怎样?如何在 .NET 中获得适合我的任务的 simestamps?
【问题讨论】:
我正在创建网络文件系统的内存本地缓存。
我希望每个目录/文件都具有LastDownloadedTime 属性,然后将其与当前时间进行比较以确定目录/文件是否太旧而无法从缓存中使用。
但我不确定DateTime.Now() 是否是我需要的。如果用户更改系统时间会怎样?如何在 .NET 中获得适合我的任务的 simestamps?
【问题讨论】:
看看System.DateTime.UTCNow()。它将返回 UTC 时间。只需确保您始终在两端调用(存储缓存时以及测试过期时)。
更多信息:https://msdn.microsoft.com/en-us/library/system.datetime.utcnow(v=vs.110).aspx
【讨论】:
UTCNow() 只考虑时区变化。
您应该使用DateTimeOffset。根据docs:
唯一且明确地识别单个时间点。 DateTimeOffset 类型可用于明确定义“现在”的含义,记录事务时间,记录系统或应用程序事件的时间,以及记录文件创建和修改时间。
但是,如果您的应用程序在用户的机器上运行,他们可以更改他们的系统时间(正如您所提到的)。防止这种情况的唯一方法是让您的应用程序 ping 时间服务器以获取权威时间戳。
【讨论】:
我想我将使用Stopwatch 作为时间戳,因为我的文件系统缓存在内存中,它无法在系统重新启动后继续存在。时间戳将与Stopwatch 的开头相关。
虽然,Stopwatch 被称为 buggy。
但我认为依赖系统时钟的解决方案更加危险,因为用户可能会将系统时钟设置为过去的某个日期,从而搞砸一切。
【讨论】:
如果您停留在本地服务器范围内,则 DateTime.UtcNow 是该任务最方便的选项。是的,如果用户更改本地时间,那么这将使缓存无效并触发不必要的更新。
您需要使用 NTP(时间)服务器来避免该问题。因此,您将从 NTP 服务器获取 UTC 时间,而不是使用本地服务器 UTC 时间(世界上有很多可用的)。
【讨论】: