【问题标题】:DateTime.Now vs system timeDateTime.Now 与系统时间
【发布时间】:2017-07-04 07:03:57
【问题描述】:

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

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 上,我的实验表明,如果我重新启动应用程序,它将显示新时区,但显示“旧”时间。重新启动系统后将采用新的时间。

【问题讨论】:

    标签: c# .net windows time


    【解决方案1】:

    您可以查看以下msdn link。它明确指出以下内容:

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

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

    为什么应用程序运行时时区没有变化? 因为时区信息被缓存了。

    我可以采取任何措施让应用在运行时获取时区更改吗? 是的,通过使用 TimeZoneInfo 类并调用其 TimeZoneInfo.ClearCachedData 方法。

    【讨论】:

    • 您是否也知道如何实现 TimeZoneInfo.ClearCachedData 在 Universal Windows 中的作用?方法不可用。
    • 在通用 Windows 中,您需要通过反射调用此方法(并在您的设备上测试它是否有效) - 它已设为私有
    • @mayu 有一个解决方法,看到这个link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2011-05-17
    • 2011-02-26
    • 1970-01-01
    • 2015-08-23
    • 2021-12-28
    • 2019-08-10
    相关资源
    最近更新 更多