【问题标题】:Why my current time zone in app is not changing?为什么我在应用程序中的当前时区没有改变?
【发布时间】:2022-01-25 16:37:03
【问题描述】:

我是 c#timezone 的新手。 我目前正在使用timezone 创建一个应用程序。

我有这个代码来获取我本地机器的当前timezone

 private void btnGetCurrentTimeZone_Click(object sender, EventArgs e)
 {
     TimeZone localZone = TimeZone.CurrentTimeZone;
     lblShowTimeZone.Text = "TimeZone: " + localZone.StandardName;
 }

我的问题是当我运行应用程序并第一次单击button 时,我得到了正确的timezone。但是当我在设置上更改系统timezone 并再次单击button 时,timezone 的值没有改变。我需要关闭应用程序并再次运行以获取正确的timezone

【问题讨论】:

  • 您需要向我们展示评估任何问题所需的所有代码。您正在谈论“单击按钮”,因此使用完整的单击处理程序会很好。我们所拥有的只是一条脱离上下文的单行......
  • 似乎TimeZone.CurrentTimeZone 在您第一次获得本地时区时使用了一个支持字段来缓存它。我似乎找不到改变这一点的方法,但如果你使用TimeZoneInfo,你可以通过调用TimeZoneInfo.ClearCachedData() 来清除它的缓存,之后TimeZoneInfo.Local 应该总是有正确的时区。
  • 感谢@Jesse 成功了。谢谢你的主意。我刚刚使用TimeZoneInfo 并使用TimeZoneInfo.ClearCachedData() 清除缓存。我所做的是用这 3 行代码 TimeZoneInfo.ClearCachedData(); TimeZoneInfo timeZone = TimeZoneInfo.Local; lblShowTimeZone.Text = "TimeZone: " + timeZone.DisplayName; 更改了以前的代码
  • .NET 框架非常棒。它对日期、时间和时区的处理是......你可能想看看 NodaTime (nodatime.org)

标签: c# timezone


【解决方案1】:

为了提高效率,您可以设置一个事件处理程序在系统时区更改时执行此操作,而不是每次调用TimeZoneInfo.Local 时都调用TimeZoneInfo.ClearCachedData()

// in some startup init method for your application
SystemEvents.TimeChanged += (s, e) => TimeZoneInfo.ClearCacheData();

现在,只有当/如果用户更改系统时区并且您可以在整个应用程序中使用 TimeZoneInfo.Local 并确信它反映了当前系统时区并且您获得了缓存该值最多的好处时,这才会被清除时间,所以它不需要每次调用一些 Win32 方法来获取当前值。

【讨论】:

    【解决方案2】:

    使用 TimeZoneInfo 代替 TimeZone; TimeZone 已弃用 reference documentation

    TimeZoneInfo localZone = TimeZoneInfo.Local;
    TimeZoneInfo.ClearCachedData();
    lblShowTimeZone.Text = "TimeZone: " + localZone.StandardName;
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • 为了让它正常工作,对ClearCachedData的调用应该在TimeZoneInfo.Local之前
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2021-12-18
    • 2015-05-11
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    相关资源
    最近更新 更多