为啥 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()输出的字符为啥不一样呢?