You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让NodaTime随Android时区更新同步获取新系统时区?

解决NodaTime在Android运行时时区更新不生效的问题
  • 问题根源:DateTimeZoneProviders.Tzdb.GetSystemDefault()会缓存首次获取的系统时区,后续调用不会主动检测系统时区的变化。NodaTime的缓存机制和.NET原生TimeZoneInfo完全独立,所以TimeZoneInfo.ClearCachedData()只会影响.NET自身的时区缓存,对NodaTime无效。

  • 解决方案:

    • 绕过NodaTime的缓存,手动获取当前系统的IANA时区ID,再从Tzdb提供者中匹配对应时区:
      // Android平台下直接获取系统当前IANA时区ID
      string currentTzId = Java.Util.TimeZone.Default.Id;
      DateTimeZone currentZone = DateTimeZoneProviders.Tzdb[currentTzId];
      
    • 也可以借助已能正确更新的TimeZoneInfo获取时区ID(Android环境下TimeZoneInfo.Local.Id返回的是标准IANA格式):
      string currentTzId = TimeZoneInfo.Local.Id;
      DateTimeZone currentZone = DateTimeZoneProviders.Tzdb[currentTzId];
      
    • 可以封装成工具方法,确保每次调用都能拿到最新时区:
      public static DateTimeZone GetUpdatedSystemTimeZone()
      {
          string tzId = Java.Util.TimeZone.Default.Id;
          // 兜底返回UTC,避免时区ID无效的情况
          return DateTimeZoneProviders.Tzdb.TryGetZoneOrNull(tzId) ?? DateTimeZone.Utc;
      }
      
  • 补充说明:NodaTime默认缓存系统时区是为了减少系统调用开销,若要响应运行时的时区变更,必须主动重新查询系统当前时区信息,而不能依赖GetSystemDefault()的缓存结果。

内容的提问来源于stack exchange,提问作者LHV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:06:00