如何让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的缓存,手动获取当前系统的IANA时区ID,再从Tzdb提供者中匹配对应时区:
补充说明:NodaTime默认缓存系统时区是为了减少系统调用开销,若要响应运行时的时区变更,必须主动重新查询系统当前时区信息,而不能依赖
GetSystemDefault()的缓存结果。
内容的提问来源于stack exchange,提问作者LHV
相关产品推荐
相关产品推荐

