DateTime.Now vs. DateTime.UtcNow我一直想知道这两个属性的工作原理到底是什么。 我知道第二个是通用的,基本上不涉及时区,但是有人可以详细解释它们的工作原理以及在哪种情况下应使用哪个? DateTime.UtcNow告诉您日期和时间,与协调世界时一致,也称为格林威治标准时区-基本上就像您在英国伦敦一样,但不在夏季。 DateTime.Now给出日期和时间,就像在您当前语言环境中的某个人所看到的那样。
我建议您在向人类显示日期时使用 这确实非常简单,所以我认为这取决于您的受众群体和居住地。 如果您不使用Utc,则必须知道要向其显示日期和时间的人员所在的时区-否则,您将告诉他们系统或服务器时间在下午3点发生了什么,而实际上是在下午5点发生了什么,他们碰巧活着。
我们之所以使用 我们还会显示相对时间(2小时前,1天前等),直到帖子老化为止,无论您居住在地球上的哪个地方,时间都是"相同的"。 还要注意性能差异; DateTime.UtcNow比DateTime.Now快30倍左右,因为内部DateTime.Now进行了大量的时区调整(您可以使用Reflector轻松地进行验证)。 因此,请勿将DateTime.Now用于相对时间测量。
在.NET中要理解的一个主要概念是,无论您处于哪个时区,现在都已遍及全球。因此,如果使用
在跨夏时制时间边界计算日期时,
我写的博客文章对此进行了介绍,该博客文章进一步解释了
*说明:任何一项分配都会存储当前时间。如果要通过
这是一个很好的问题。我正在恢复它,以提供更多有关.Net在不同的
在内部,日期存储为
如果您(GMT-6)比格林尼治标准时间(GMT-6)晚6个小时,那么您将获得格林尼治标准时间(GMT)6个小时前的时间。 .Net实际上会忽略 具有不同"种类"值的DateTime实例不兼容。 让我们看一些代码...
如您所见,比较和数学函数不会自动转换为兼容时间。
您还可以看到"解决方法",它可以简单地将
我对问题的直接回答与接受答案有关何时使用每个人的建议相一致。除了在I / O(显示和解析)期间,您应该始终尝试使用具有
DateTime不知道什么时区。它始终假定您在本地时间。 UtcNow仅表示"从时间中减去我的时区"。
如果要使用可识别时区的日期,请使用DateTimeOffset,它表示带有时区的日期/时间。我必须努力学习。
该问题的"简单"答案是: DateTime.Now返回一个DateTime值,该值表示当前系统时间(在系统运行的任何时区中)。 DateTime.Kind属性将为DateTimeKind.Local DateTime.UtcNow返回一个DateTime值,该值表示当前的通用协调时间(又称UTC),无论系统时区如何,该时间都相同。 DateTime.Kind属性将为DateTimeKind.Utc 除了上述几点外,DateTime结构还包含一个名为Kind的鲜为人知的字段(至少,我很长一段时间都不了解它)。它基本上只是一个标志,指示时间是本地时间还是UTC。它未指定本地时间与UTC的实际偏移量。除了表明构造意图的意图这一事实之外,它还影响方法ToUniversalTime()和ToLocalTime()的工作方式。 晚会晚了一点,但我发现这两个链接(4guysfromrolla)非常有用: 使用协调世界时(UTC)存储日期/时间值 在不同时区存储和显示日期和时间的建议 DateTime.UtcNow是一种通用时标,省略了夏令时。因此,UTC永远不会因为DST而改变。 但是,DateTime.Now不是连续的或单值的,因为它会根据DST进行更改。这意味着DateTime.Now,同一时间值可能出现两次,使客户处于混乱状态。 DateTime.UtcNow是连续的单值时间标度,而DateTime.Now不是连续的或单值的时标。主要原因是夏令时,不适用于UTC。因此,UTC永远不会向前或向后跳一个小时,而本地时间(DateTime.Now)会跳。当它向后跳时,同一时间值出现两次。 最大的区别是:)是SharePoint Workflow不支持DateTime.Now,您必须使用DateTime.UtcNow 当您需要在本地运行计算机时(例如,欧洲的CEST),请使用Now。如果您想要一个通用时间-UtcNow。只是您的喜好问题-可能制作一个您想使用用户时间的本地网站/独立应用程序-因此受其时区设置-DateTime.Now的影响。 请记住,对于网站而言,这是服务器的时区设置。因此,如果要为用户显示时间,请获取其首选的时区并更改时间(只需将Utc时间保存到数据库中,然后进行修改即可)或指定其为UTC。如果您忘记这样做,则用户会看到类似的内容:3分钟前发布,然后在将来某个时间发布:) |