我一直在想,这两个属性的工作原理究竟是什么。我知道第二个是通用的,基本上不涉及时区,但谁能详细解释一下它们是如何工作的,以及在什么情况下应该使用哪个?
当前回答
DateTime不知道时区是什么。它总是假设你在当地时间。UtcNow只意味着“从时间中减去我的时区”。
如果您想使用支持时区的日期,请使用DateTimeOffset,它表示带有时区的日期/时间。这是我吃了不少苦头才明白的。
其他回答
只是对上述要点的一点补充:DateTime结构体还包含一个鲜为人知的名为Kind的字段(至少,我很长时间都不知道它)。它基本上只是一个标志,指示时间是本地时间还是UTC时间;它不指定本地时间与UTC的实际偏移量。除了表明构造结构的意图之外,它还影响了ToUniversalTime()和ToLocalTime()方法的工作方式。
还要注意性能差异;DateTime。UtcNow大约比DateTime快30倍。现在,因为内部DateTime。现在正在做很多时区调整(你可以很容易地验证这与反射器)。
所以不要使用DateTime。现在是相对时间测量。
DateTime。UtcNow是省略日光节约时间的通用时间刻度。所以UTC时间不会因为夏令时而改变。
但是,DateTime。Now不是连续的或单值的,因为它根据DST变化。也就是DateTime。现在,相同的时间值可能会出现两次,让客户处于困惑的状态。
在。net中需要理解的一个主要概念是,现在是全世界的现在,无论你在哪个时区。如果你用DateTime加载一个变量。现在或日期时间。UtcNow——任务是一样的。您的DateTime对象知道您所在的时区,并将其考虑进来,而不考虑分配。
DateTime的有用性。在计算跨越夏令时边界的日期时,UtcNow非常方便。即在参加夏令时的地方,有时从中午到第二天中午有25个小时,有时从中午到第二天中午有23个小时。如果您希望正确地确定时间A和时间B的小时数,那么在计算TimeSpan之前,您需要首先将它们转换为它们的UTC等效值。
我写了一篇博客文章,进一步解释了TimeSpan,并包含了一个链接到关于该主题的更广泛的MS文章。
*澄清:任何赋值都将存储当前时间。如果你要加载两个变量,一个是通过DateTime.Now(),另一个是通过DateTime.UtcNow(),两者之间的时间差将是毫秒,而不是小时,假设你在一个时区小时与GMT。如下所述,打印出它们的String值将显示不同的字符串。
DateTime不知道时区是什么。它总是假设你在当地时间。UtcNow只意味着“从时间中减去我的时区”。
如果您想使用支持时区的日期,请使用DateTimeOffset,它表示带有时区的日期/时间。这是我吃了不少苦头才明白的。
推荐文章
- 按类型查找WPF窗口中的所有控件
- 数组与列表的性能
- 我如何预填充一个jQuery Datepicker文本框与今天的日期?
- 从Description属性中获取Enum
- 为什么使用try {} finally{}和一个空的try块?
- 如何在内存中获取对象大小?
- 每个优秀的。net开发人员都应该能够回答的问题?
- 当js得到当月的第一天和最后一天
- 如何编辑。csproj文件
- EscapeUriString和EscapeDataString的区别是什么?
- 在c++ /CLI中插入号(' ^ ')是什么意思?
- 什么时候应该使用TaskCompletionSource<T> ?
- 为什么处理排序数组比未排序数组慢?
- .net中ObservableCollection有什么用?
- LINQ单对第一