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


当前回答

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

其他回答

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

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

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

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

如果您想使用支持时区的日期,请使用DateTimeOffset,它表示带有时区的日期/时间。这是我吃了不少苦头才明白的。

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

DateTime。现在返回一个DateTime值,表示当前系统时间(无论系统运行在哪个时区)。DateTime。Kind属性将为DateTimeKind。当地的

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

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