DateTime.Now vs系统时间

时间:2017-07-04 07:03:57

标签: c# .net windows time

让我们假设这个小程序运行:

while (true)
{
    Console.WriteLine($"{DateTime.UtcNow} -> {DateTime.Now} tz={TimeZone.CurrentTimeZone.StandardName} / {TimeZoneInfo.Local.StandardName}");
    await Task.Delay(TimeSpan.FromSeconds(1));
}

当我在程序运行时更改系统的时区时,应用程序看不到更改。时区和时间就像时区没有改变一样。

为了让应用程序显示新的时间和时区,我需要重新启动应用程序。

如果我更改系统时间,则会立即获取时间更改。

如果你可以帮我解决三个问题,那就太好了:

  • 是否记录在任何地方?
  • 为什么在应用程序运行时没有获得时区更改?
  • 我可以做任何事情,以便应用程序在运行时选择时区更改吗?

这是一个小截图,显示.NET应用程序使用的时间与操作系统不同: .NET App out of sync with system time.

顺便说一句。在Raspberry Pi上的Windows IOT上,我的实验表明,如果我重新启动应用程序,它将显示新的时区,但是“旧”时间。重新启动系统后将获取新时间。

1 个答案:

答案 0 :(得分:41)

您可以查看以下msdn link。它清楚地说明了以下内容:

  

呼叫者注意事项:在CurrentTimeZone之后缓存本地时区数据   首先用于检索时区信息。如果系统是本地的   时区随后更改,CurrentTimeZone属性不会   反映这种变化。如果您需要处理时区更改   您的应用程序正在运行,请使用TimeZoneInfo类并调用它   TimeZoneInfo.ClearCachedData方法。

是否记录在任何地方? 是的,如上所述。

为什么在应用程序运行时没有获得时区更改? 因为时区信息是缓存的。

我可以做任何事情,以便应用程序在运行时选择时区更改吗? 是的,通过使用TimeZoneInfo类并调用其TimeZoneInfo.ClearCachedData方法。