为啥 DateTime.Now 和 DateTime.UtcNow 不是我当前的本地日期时间?

Posted

技术标签:

【中文标题】为啥 DateTime.Now 和 DateTime.UtcNow 不是我当前的本地日期时间?【英文标题】:Why DateTime.Now and DateTime.UtcNow Isn't My Current Local DateTime?为什么 DateTime.Now 和 DateTime.UtcNow 不是我当前的本地日期时间? 【发布时间】:2015-06-20 02:11:15 【问题描述】:

我们使用DateTime.Now,但是时间和我们的服务器时间不等!

当我运行我的项目时,这些是DateTime 属性值:

DateTime.Now = 15/14/04 05:20:18 AM
DateTime.UtcNow = 15/14/04 12:20:18 PM

但是我当前的本地系统时间是:

15/14/04 04:50:18 AM

我的时区是德黑兰 (UTC+03:30)。

这是我第一次看到这种行为!为什么DateTime.Now 不等于我电脑的时间?

【问题讨论】:

除非您有幸处于本初子午线,否则 UTCNow 永远不会等于您当地的时区。 您的服务器位于哪个时区,因此 15/14/04 05:38:56 AM 本地时间是 15/14/04 12:39:15 PM UTC?一个偏移量为 7 小时 19 秒的? 确保您的文化设置正确 - 检查Thread.CurrentThread.CurrentCulture 我的时区是 (UTC+03:30) 德黑兰。 请检查控制面板中窗口的日期和时间设置以及UTC设置。 【参考方案1】:

确保您没有在代码中的某处操纵时区,或使用 System.Globalization.CultureInfo 尝试在所有源代码中搜索 System.Globalization.CultureInfo 可能是它在某个地方,也可能是时区缓存在某个地方所以尝试在DateTime.Now 之前调用System.Globalization.CultureInfo.CurrentCulture.ClearCachedData()

.NET DateTime.Now returns incorrect time when time zone is changed

【讨论】:

再次,正如我在另一条评论中所写:文化和时区不相关,因此摆弄CultureInfo 并不能解决时区问题。 谢谢我的朋友。我把'System.Globalization.CultureInfo.CurrentCulture.ClearCachedData()'放在datetime.now之前,我的问题已经解决了:)所以thansks 我的立场是正确的。尽管文化和时区不相关,但在source code for CultureInfo.ClearCachedData 中可以看到一个链接:在第 1373 行有一个对TimeZone.ResetTimeZone() 的调用,因此重置当前文化重置当前时区信息。 你的链接太棒了!所以你说这不是一个好的解决方案吗?【参考方案2】:

您的时区是 UTC +03:30,但由于夏令时是 +4:30。这意味着当DateTime.UtcNow = 15/14/04 12:20:18 PM 时,它在您的时区中是04:50:18 AM,您的时钟会确认这一点。

所以您的DateTime.Now 不会确认您机器的日期时间设置,使其返回的值与您的时钟不匹配。

DateTime.Now 使用 TimeZoneInfo 类从 UTC 计算本地时间(使用时区和夏令时)可以解释为什么接受的答案有效,但我不知道 为什么 em> 可能会不同步。您是否从不回收您的应用程序池并且从不关闭您的机器? ;)

System.Globalization.CultureInfo.CurrentCulture.ClearCachedData() 有效,因为它调用了TimeZone.ResetTimeZone()TimeZoneInfo.ClearCachedData()

【讨论】:

文化与时区无关。文化决定了如何根据文化来格式化日期、时间和数字。时区根据您在地球上的位置确定时间,同一时区可以有许多不同的文化,反之亦然。 @Martin 你完全正确。除了删除此答案之外,您还有什么建议?我发现 DateTime.Now and Culture/Timezone specific 和 C#: Making sure DateTime.Now returns a GMT + 1 time 似乎相关,但没有关于“DateTime.Now 与机器设置不对应”原因的指针。 我对这个问题没有很好的答案。也许有一些我们不知道的东西,但这对于理解这个问题非常重要,但是我认为我没有什么要补充的问题。 感谢朋友的帮助。我跑了第一个答案,它起作用了:)

以上是关于为啥 DateTime.Now 和 DateTime.UtcNow 不是我当前的本地日期时间?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DateTime.Now 和 DateTime.UtcNow 不是我当前的本地日期时间?

python: 为啥 datetime.now() 的 tzinfo 没有? [复制]

DateTime.UtcNow.ToString() 和DateTime.Now.ToString()输出的字符为啥不一样呢?

为啥 DateTime.Now 是属性而不是方法?

“DateTime.Now” - 为啥它返回 GMT?

要点笔记