C# DateTime.Now vs系统时间

C# DateTime.Now vs系统时间,c#,.net,windows,time,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)); } 当我在程序运行时更改系统时区时,应用程序看不到

让我们想象一下,这个小程序运行:

while (true)
{
    Console.WriteLine($"{DateTime.UtcNow} -> {DateTime.Now} tz={TimeZone.CurrentTimeZone.StandardName} / {TimeZoneInfo.Local.StandardName}");
    await Task.Delay(TimeSpan.FromSeconds(1));
}
当我在程序运行时更改系统时区时,应用程序看不到更改。时区和时间就像时区没有改变一样

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

如果我更改了系统时间,时间更改会立即被拾取

如果您能帮我回答三个问题,那就太好了:

  • 这有文件记录吗
  • 为什么在应用程序运行时没有检测到时区更改
  • 我可以做些什么,让应用程序在运行时能够捕捉时区的变化吗
下面是一个小屏幕截图,显示使用不同于操作系统的时间的.NET应用程序:


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

您可以检查以下msdn。它明确规定如下:

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

是否在任何地方记录了此信息? 是的,如上所述

为什么在应用程序运行时未检测到时区更改? 因为时区信息是缓存的

我能做些什么,让应用程序在运行时捕捉时区变化吗?
是的,通过使用TimeZoneInfo类并调用其TimeZoneInfo.ClearCachedData方法。

您还知道如何实现TimeZoneInfo.ClearCachedData在通用Windows中的功能吗?此方法不可用。在Universal Windows中,您需要通过反射调用此方法(并测试其在您的设备上是否工作)-此方法已生成private@mayu有一个解决办法,看到这个了吗