.net - c# 8.0



DateTime.Now与DateTime.UtcNow (8)

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

https://code.i-harness.com


DateTime.UtcNow是一个连续的单值时间刻度,而DateTime.Now不是连续的或单值的。 主要原因是夏令时,不适用于UTC。 所以UTC不会向前跳转或返回一个小时,而本地时间(DateTime.Now)会。 当它向后跳时,相同的时间值会出现两次。


DateTime不知道什么时区是。 它总是假设你在当地时间。 UtcNow只意味着“从时间上减去我的时区”。

如果要使用时区感知日期,请使用DateTimeOffset ,它表示具有时区的日期/时间。 我必须学习这种艰难的方式。


在.NET中理解的一个主要概念是, 现在无论您处于什么时区, 现在都遍布全球。因此,如果您使用DateTime.Now或DateTime.UtcNow加载变量 - 赋值是相同的。*您的DateTime对象知道你在什么时区,并将其考虑在内,而不考虑分配。

在计算日光节约时间边界的日期时,DateTime.UtcNow的用处非常方便。 也就是说,在参加夏令时的地方,有时从第二天中午到第二天有25小时,有时在第二天中午到中午之间有23小时。 如果您想要正确确定时间A和时间B的小时数,则需要先计算TimeSpan,然后再将其转换为UTC当量。

我撰写一篇博客文章对此进行了报道, 这篇博客文章进一步解释了TimeSpan,并且包含了有关该主题的更多MS文章的链接。

*澄清:任何任务都会存储当前时间。 如果您要通过DateTime.Now()加载两个变量,并通过DateTime.UtcNow()加载两个变量,则两者之间的TimeSpan差异将为毫秒,而不是几小时,假定您在距离GMT的时区数小时内。 如下所述,打印出它们的字符串值将显示不同的字符串。


如果您需要本地时间运行应用程序(例如CEST for Europe),请使用Now。 如果你想要一个世界时 - UtcNow。 这只是您的偏好的问题 - 可能使您想要使用时间用户的本地网站/独立应用程序 - 受他/她的时区设置影响 - DateTime.Now。

请记住,对于一个网站来说,它是服务器的时区设置。 因此,如果您要显示用户的时间,可以获取他的首选时区并转移时间(然后将Utc时间保存到数据库,然后修改它)或指定它的UTC。 如果你忘记这么做,用户可以看到如下内容: 在3分钟前发布 ,然后在未来的某个时间附近:)


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

所以不要使用DateTime.Now进行相对时间测量。


这个问题的“简单”答案是:

DateTime.Now返回表示当前系统时间的DateTime值(在系统运行的任何时区)。 DateTime.Kind属性将为DateTimeKind.Local

DateTime.UtcNow返回一个DateTime值,表示当前的通用协调时间(aka UTC),无论系统的时区如何,它都是相同的。 DateTime.Kind属性将为DateTimeKind.Utc


这真的很简单,所以我认为这取决于你的观众和他们住在哪里。

如果你不使用Utc,你必须知道你正在显示日期和时间的人的时区 - 否则你会告诉他们在下午3点在系统或服务器时间发生的事情,当它真的发生在下午5点他们碰巧活着。

我们使用DateTime.UtcNow因为我们有一个全球网络用户,而且我不希望每个用户都填写表格来指明他们居住在哪个时区。

我们还会显示相对时间(2小时前,1天前等),直到时间足够长,无论您居住在地球上什么时间都是“相同”。


除了上面提到的几点之外,DateTime结构还包含一个叫做Kind的小字段(至少,我很久以前就不知道了)。 它基本上只是一个标志,指示时间是本地还是UTC; 它并没有指定当地时间UTC的实际偏移量。 除了它指出构建stuct的意图这一事实外,它还影响ToUniversalTime()ToLocalTime()工作方式。





date