我一直在想,这两个属性的工作原理究竟是什么。我知道第二个是通用的,基本上不涉及时区,但谁能详细解释一下它们是如何工作的,以及在什么情况下应该使用哪个?
当前回答
还要注意性能差异;DateTime。UtcNow大约比DateTime快30倍。现在,因为内部DateTime。现在正在做很多时区调整(你可以很容易地验证这与反射器)。
所以不要使用DateTime。现在是相对时间测量。
其他回答
最大的区别:)是DateTime。现在SharePoint工作流不支持,您必须使用DateTime。UtcNow
这是个好问题。我恢复它是为了更详细地说明. net如何处理不同的Kind值。正如@Jan Zich指出的那样,它实际上是一个非常重要的属性,并且根据您使用Now还是UtcNow设置不同。
在内部,日期存储为Ticks(与@Carl Camera的答案相反),这取决于您是否使用Now或UtcNow。
DateTime。UtcNow的行为与其他语言相似。它将tick设置为基于GMT的值。它还将Kind设置为Utc。
DateTime。现在将Ticks值更改为如果它是您在GMT时区中的一天时间。它还将Kind设置为Local。
如果你晚了6个小时(GMT-6),你将得到6小时前的GMT时间。net实际上忽略了Kind,并将这个时间视为6小时前的时间,尽管它应该是“现在”。如果您创建一个DateTime实例,然后更改您的时区并尝试使用它,则会破坏更多。
具有不同“Kind”值的DateTime实例不兼容。
让我们看一些代码……
DateTime utc = DateTime.UtcNow;
DateTime now = DateTime.Now;
Debug.Log (utc + " " + utc.Kind); // 05/20/2015 17:19:27 Utc
Debug.Log (now + " " + now.Kind); // 05/20/2015 10:19:27 Local
Debug.Log (utc.Ticks); // 635677391678617830
Debug.Log (now.Ticks); // 635677139678617840
now = now.AddHours(1);
TimeSpan diff = utc - now;
Debug.Log (diff); // 05:59:59.9999990
Debug.Log (utc < now); // false
Debug.Log (utc == now); // false
Debug.Log (utc > now); // true
Debug.Log (utc.ToUniversalTime() < now.ToUniversalTime()); // true
Debug.Log (utc.ToUniversalTime() == now.ToUniversalTime()); // false
Debug.Log (utc.ToUniversalTime() > now.ToUniversalTime()); // false
Debug.Log (utc.ToUniversalTime() - now.ToUniversalTime()); // -01:00:00.0000010
正如您在这里看到的,比较和数学函数不会自动转换为兼容时间。时间间隔应该是将近一个小时,但实际上是将近6个小时。"utc < now"应该是真的(我甚至添加了一个小时来确保),但仍然是假的。
你也可以看到“周围的工作”,这是简单地转换为世界时的任何地方,Kind是不一样的。
我对这个问题的直接回答与公认答案中关于何时使用每种语言的建议一致。您应该总是尝试使用Kind=Utc的DateTime对象,除非在i/o(显示和解析)期间。这意味着您几乎总是应该使用DateTime。UtcNow,除了你创建对象只是为了显示它,并立即丢弃它的情况。
DateTime。UtcNow告诉你的日期和时间是协调世界时,也被称为格林威治标准时间时区——基本上就像如果你在英国伦敦,但不是在夏天。DateTime。现在给出在当前区域显示的日期和时间。
我推荐使用DateTime。现在,无论何时你向人们展示一个日期——这样他们就会对他们所看到的值感到满意——他们可以很容易地将其与他们在手表或时钟上看到的值进行比较。使用DateTime。UtcNow当您想要存储日期或在以后的计算中使用它们时(在客户机-服务器模型中),您的计算不会被位于不同时区的客户机与服务器或彼此之间的客户机所混淆。
这真的很简单,所以我认为这取决于你的受众是什么以及他们生活在哪里。
如果不使用Utc,则必须知道要显示日期和时间的对象所在的时区——否则将告诉他们系统时间或服务器时间下午3点发生的事情,而实际上发生在他们恰好居住的下午5点。
我们使用DateTime。UtcNow因为我们的网络受众是全球的,也因为我不想让每个用户都填写一个表格,说明他们生活在哪个时区。
我们还显示相对时间(2小时前,1天前,等等),直到帖子年龄足够大,无论你住在地球上的哪个地方,时间都是“相同的”。
DateTime。UtcNow是一个连续的单值时间刻度,而DateTime。Now不是连续的或单值的。主要原因是日光节约时间,它不适用于协调世界时。因此UTC不会向前或向后跳一个小时,而本地时间(DateTime.Now)则会。当它向后跳转时,相同的时间值出现两次。
推荐文章
- c# .NET中的App.config是什么?如何使用它?
- String类中的什么方法只返回前N个字符?
- 我如何提高ASP。NET MVC应用程序性能?
- 无法解析类型为“Microsoft.AspNetCore.Http.IHttpContextAccessor”的服务
- 如何在没有任何错误或警告的情况下找到构建失败的原因
- Visual Studio弹出提示:“操作无法完成”
- 否ConcurrentList<T>在。net 4.0?
- 在c#中解析字符串为日期时间
- 如何减去日期/时间在JavaScript?
- 由Jon Skeet撰写的《Singleton》澄清
- 自定义数字格式字符串始终显示符号
- Post参数始终为空
- string.ToLower()和string.ToLowerInvariant()
- 将Date对象转换为日历对象
- 检查instance是否属于某个类型