我一直在想,这两个属性的工作原理究竟是什么。我知道第二个是通用的,基本上不涉及时区,但谁能详细解释一下它们是如何工作的,以及在什么情况下应该使用哪个?
当前回答
只是对上述要点的一点补充:DateTime结构体还包含一个鲜为人知的名为Kind的字段(至少,我很长时间都不知道它)。它基本上只是一个标志,指示时间是本地时间还是UTC时间;它不指定本地时间与UTC的实际偏移量。除了表明构造结构的意图之外,它还影响了ToUniversalTime()和ToLocalTime()方法的工作方式。
其他回答
当您需要应用程序运行的机器的本地时间(例如欧洲的CEST时间)时,请使用Now。如果你想要一个通用时间- UtcNow。这只是你的喜好的问题-可能做一个本地网站/独立的应用程序,你想使用的时间用户有-所以受他/她的时区设置- DateTime.Now。
记住,对于一个网站来说,它是服务器的时区设置。因此,如果您正在为用户显示时间,要么获取他的首选时区并移动时间(只需将Utc时间保存到数据库并修改它),要么指定它为Utc。如果你忘记这样做,用户可以看到类似这样的东西:张贴3减前,然后在未来的时间附近:)
这个问题的“简单”答案是:
DateTime。现在返回一个DateTime值,表示当前系统时间(无论系统运行在哪个时区)。DateTime。Kind属性将为DateTimeKind。当地的
DateTime。UtcNow返回一个DateTime值,表示当前的通用协调时间(即UTC),无论系统的时区如何,该值都是相同的。DateTime。Kind属性将为DateTimeKind。Utc
有点晚了,但我发现这两个链接(4guysfromrolla)非常有用:
使用协调世界时(UTC)存储日期/时间值
跨不同时区存储和显示日期和时间的建议
这真的很简单,所以我认为这取决于你的受众是什么以及他们生活在哪里。
如果不使用Utc,则必须知道要显示日期和时间的对象所在的时区——否则将告诉他们系统时间或服务器时间下午3点发生的事情,而实际上发生在他们恰好居住的下午5点。
我们使用DateTime。UtcNow因为我们的网络受众是全球的,也因为我不想让每个用户都填写一个表格,说明他们生活在哪个时区。
我们还显示相对时间(2小时前,1天前,等等),直到帖子年龄足够大,无论你住在地球上的哪个地方,时间都是“相同的”。
还要注意性能差异;DateTime。UtcNow大约比DateTime快30倍。现在,因为内部DateTime。现在正在做很多时区调整(你可以很容易地验证这与反射器)。
所以不要使用DateTime。现在是相对时间测量。
推荐文章
- 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是否属于某个类型