我一直在想,这两个属性的工作原理究竟是什么。我知道第二个是通用的,基本上不涉及时区,但谁能详细解释一下它们是如何工作的,以及在什么情况下应该使用哪个?


当前回答

在。net中需要理解的一个主要概念是,现在是全世界的现在,无论你在哪个时区。如果你用DateTime加载一个变量。现在或日期时间。UtcNow——任务是一样的。您的DateTime对象知道您所在的时区,并将其考虑进来,而不考虑分配。

DateTime的有用性。在计算跨越夏令时边界的日期时,UtcNow非常方便。即在参加夏令时的地方,有时从中午到第二天中午有25个小时,有时从中午到第二天中午有23个小时。如果您希望正确地确定时间A和时间B的小时数,那么在计算TimeSpan之前,您需要首先将它们转换为它们的UTC等效值。

我写了一篇博客文章,进一步解释了TimeSpan,并包含了一个链接到关于该主题的更广泛的MS文章。

*澄清:任何赋值都将存储当前时间。如果你要加载两个变量,一个是通过DateTime.Now(),另一个是通过DateTime.UtcNow(),两者之间的时间差将是毫秒,而不是小时,假设你在一个时区小时与GMT。如下所述,打印出它们的String值将显示不同的字符串。

其他回答

DateTime。UtcNow是省略日光节约时间的通用时间刻度。所以UTC时间不会因为夏令时而改变。

但是,DateTime。Now不是连续的或单值的,因为它根据DST变化。也就是DateTime。现在,相同的时间值可能会出现两次,让客户处于困惑的状态。

DateTime。UtcNow是一个连续的单值时间刻度,而DateTime。Now不是连续的或单值的。主要原因是日光节约时间,它不适用于协调世界时。因此UTC不会向前或向后跳一个小时,而本地时间(DateTime.Now)则会。当它向后跳转时,相同的时间值出现两次。

DateTime。UtcNow告诉你的日期和时间是协调世界时,也被称为格林威治标准时间时区——基本上就像如果你在英国伦敦,但不是在夏天。DateTime。现在给出在当前区域显示的日期和时间。

我推荐使用DateTime。现在,无论何时你向人们展示一个日期——这样他们就会对他们所看到的值感到满意——他们可以很容易地将其与他们在手表或时钟上看到的值进行比较。使用DateTime。UtcNow当您想要存储日期或在以后的计算中使用它们时(在客户机-服务器模型中),您的计算不会被位于不同时区的客户机与服务器或彼此之间的客户机所混淆。

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

这真的很简单,所以我认为这取决于你的受众是什么以及他们生活在哪里。

如果不使用Utc,则必须知道要显示日期和时间的对象所在的时区——否则将告诉他们系统时间或服务器时间下午3点发生的事情,而实际上发生在他们恰好居住的下午5点。

我们使用DateTime。UtcNow因为我们的网络受众是全球的,也因为我不想让每个用户都填写一个表格,说明他们生活在哪个时区。

我们还显示相对时间(2小时前,1天前,等等),直到帖子年龄足够大,无论你住在地球上的哪个地方,时间都是“相同的”。