DateTime.Now与DateTime.UtcNow

时间:2020-03-05 18:53:14  来源:igfitidea点击:

我一直想知道这两个属性的工作原理到底是什么。我知道第二个是通用的,基本上不涉及时区,但是有人可以详细解释它们的工作原理以及在哪种情况下应使用哪个?

解决方案

回答

DateTime.UtcNow会告诉我们与协调世界时相同的日期和时间,也就是格林威治标准时区,基本上就像我们在英国伦敦一样,但不在夏季。 DateTime.Now提供在我们当前语言环境中的日期和时间。

我建议我们在向人类显示日期时使用DateTime.Now,这样他们对他们看到的值感到满意,就可以轻松地将它们与手表或者时钟上的显示进行比较。当我们想存储日期或者将其用于以后的计算时(在客户端-服务器模型中),请使用DateTime.UtcNow,以使计算不会被服务器或者彼此不同时区的客户端混淆。

回答

这确实非常简单,所以我认为这取决于受众群体以及他们的居住地。

如果我们不使用Utc,则必须知道要显示日期和时间的人员所在的时区-否则,我们将告诉他们系统或者服务器时间下午3点发生了什么,而实际上这是在下午5点发生碰巧活着。

我们使用DateTime.UtcNow是因为我们拥有全球的网络受众,并且因为我不希望每个用户都填写表格来表明他们所居住的时区。

我们还会显示相对时间(2小时前,1天前,等等),直到帖子老化为止,无论我们居住在地球上的哪个地方,时间都是"相同的"。

回答

当我们需要在本地运行计算机时(例如,欧洲的CEST),请使用Now。如果我们想使用通用时间UtcNow。我们可以根据自己的喜好来设置本地网站/独立应用程序,以便用户在其时区设置DateTime.Now的影响下使用它。

请记住,对于网站而言,这是服务器的时区设置。因此,如果我们要为用户显示时间,请获取其首选时区并更改时间(只需将Utc时间保存到数据库中,然后进行修改即可)或者指定其为UTC。如果我们忘记这样做,则用户会看到类似的内容:3分钟前发布,然后在将来某个时间发布:)

回答

DateTime不知道什么时区。它始终以我们在当地时间为前提。 UtcNow仅表示"从时间中减去我的时区"。

如果要使用支持时区的日期,请使用DateTimeOffset,它表示带有时区的日期/时间。我必须努力学习。

回答

在.NET中要理解的一个主要概念是,无论我们处于什么时区,现在都已遍及全球。因此,如果使用DateTime.Now或者DateTime.UtcNow加载变量,则分配是相同的。* DateTime对象知道我们所在的时区,并将其考虑在内(无论分配如何)。

在跨夏时制时间边界计算日期时,DateTime.UtcNow的实用性非常有用。也就是说,在参与夏时制的地方,有时从第二天的中午到第二天的中午有25个小时,有时在第二天的中午到中午之间有23个小时。如果要正确确定从时间A和时间B开始的小时数,则需要先将每个小时转换为它们的UTC等效时间,然后再计算TimeSpan。

我写的一篇博客文章对此进行了介绍,该文章进一步解释了TimeSpan,并包含指向该主题的更广泛的MS文章的链接。

*说明:任何一项分配都会存储当前时间。如果要通过DateTime.Now()加载两个变量,而通过DateTime.UtcNow()加载另一个变量,则两者之间的TimeSpan差将是毫秒,而不是几小时,前提是我们距离GMT时区小时。如下所述,打印出它们的String值将显示不同的字符串。

回答

还要注意性能差异; DateTime.UtcNow比DateTime.Now快30倍左右,因为内部DateTime.Now进行了大量的时区调整(我们可以使用Reflector轻松地进行验证)。

因此,请勿将DateTime.Now用于相对时间测量。

回答

除了上述几点外,DateTime结构还包含一个名为Kind的鲜为人知的字段(至少,我很长一段时间都不知道)。基本上,它只是一个标志,指示时间是本地时间还是UTC。它未指定本地时间与UTC的实际偏移量。除了表明构造意图的意图这一事实之外,它还影响方法ToUniversalTime()和ToLocalTime()的工作方式。