我一直在想,这两个属性的工作原理究竟是什么。我知道第二个是通用的,基本上不涉及时区,但谁能详细解释一下它们是如何工作的,以及在什么情况下应该使用哪个?
当前回答
当您需要应用程序运行的机器的本地时间(例如欧洲的CEST时间)时,请使用Now。如果你想要一个通用时间- UtcNow。这只是你的喜好的问题-可能做一个本地网站/独立的应用程序,你想使用的时间用户有-所以受他/她的时区设置- DateTime.Now。
记住,对于一个网站来说,它是服务器的时区设置。因此,如果您正在为用户显示时间,要么获取他的首选时区并移动时间(只需将Utc时间保存到数据库并修改它),要么指定它为Utc。如果你忘记这样做,用户可以看到类似这样的东西:张贴3减前,然后在未来的时间附近:)
其他回答
DateTime不知道时区是什么。它总是假设你在当地时间。UtcNow只意味着“从时间中减去我的时区”。
如果您想使用支持时区的日期,请使用DateTimeOffset,它表示带有时区的日期/时间。这是我吃了不少苦头才明白的。
只是对上述要点的一点补充:DateTime结构体还包含一个鲜为人知的名为Kind的字段(至少,我很长时间都不知道它)。它基本上只是一个标志,指示时间是本地时间还是UTC时间;它不指定本地时间与UTC的实际偏移量。除了表明构造结构的意图之外,它还影响了ToUniversalTime()和ToLocalTime()方法的工作方式。
在。net中需要理解的一个主要概念是,现在是全世界的现在,无论你在哪个时区。如果你用DateTime加载一个变量。现在或日期时间。UtcNow——任务是一样的。您的DateTime对象知道您所在的时区,并将其考虑进来,而不考虑分配。
DateTime的有用性。在计算跨越夏令时边界的日期时,UtcNow非常方便。即在参加夏令时的地方,有时从中午到第二天中午有25个小时,有时从中午到第二天中午有23个小时。如果您希望正确地确定时间A和时间B的小时数,那么在计算TimeSpan之前,您需要首先将它们转换为它们的UTC等效值。
我写了一篇博客文章,进一步解释了TimeSpan,并包含了一个链接到关于该主题的更广泛的MS文章。
*澄清:任何赋值都将存储当前时间。如果你要加载两个变量,一个是通过DateTime.Now(),另一个是通过DateTime.UtcNow(),两者之间的时间差将是毫秒,而不是小时,假设你在一个时区小时与GMT。如下所述,打印出它们的String值将显示不同的字符串。
DateTime。UtcNow是一个连续的单值时间刻度,而DateTime。Now不是连续的或单值的。主要原因是日光节约时间,它不适用于协调世界时。因此UTC不会向前或向后跳一个小时,而本地时间(DateTime.Now)则会。当它向后跳转时,相同的时间值出现两次。
当您需要应用程序运行的机器的本地时间(例如欧洲的CEST时间)时,请使用Now。如果你想要一个通用时间- UtcNow。这只是你的喜好的问题-可能做一个本地网站/独立的应用程序,你想使用的时间用户有-所以受他/她的时区设置- DateTime.Now。
记住,对于一个网站来说,它是服务器的时区设置。因此,如果您正在为用户显示时间,要么获取他的首选时区并移动时间(只需将Utc时间保存到数据库并修改它),要么指定它为Utc。如果你忘记这样做,用户可以看到类似这样的东西:张贴3减前,然后在未来的时间附近:)
推荐文章
- 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是否属于某个类型