2017-07-04 83 views
25

让我们想象一下,这个小程序运行:DateTime.Now VS系统时间

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.

BTW。在Raspberry Pi上的Windows IOT上,我的实验显示,如果我重新启动应用程序,它将显示新的时区,但显示“旧”时间。重新启动系统后,新时间将会启动。

回答

40

您可以查看以下msdn link。它明确规定了以下内容:

注释来电者:后CurrentTimeZone 首先用于检索时区信息本地时区是缓存数据。如果系统的本地 时区随后发生更改,则CurrentTimeZone属性不会反映此更改, 。如果您需要处理时区更改,而您的应用程序正在运行 ,请使用TimeZoneInfo类并调用其 TimeZoneInfo.ClearCachedData方法。

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

为什么在应用程序运行时没有找到时区更改? 因为时区信息被缓存。

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

+1

你还知道如何实现TimeZoneInfo.ClearCachedData在通用Windows中的功能吗?该方法不可用。 – mayu

+1

在通用Windows中,您需要通过反射调用此方法(并测试它在您的设备上工作) - 它已被制作为私有 – mayu