当Android更新时区时如何让NodaTime更新?

问题描述 投票:0回答:1

我是 NodaTime 的新手,并且仍在寻找解决方法。

如果当我启动程序时,Android 时区设置为“美国/纽约” NodaTime

DateTimeZoneProviders.Tzdb.GetSystemDefault()
正确返回“America/New_York”

但是,如果我在程序运行时通过 Android 设置将时区更新为“America/Denver”,那么

DateTimeZoneProviders.Tzdb.GetSystemDefault()
仍然返回“America/New_York”

如何让程序读取新的 Android 系统时区并返回该信息?

我看不到

TimeZoneInfo.ClearCachedData()
的任何等效项,并且首先运行它对 NodaTime 没有任何影响,尽管 TimeZoneInfo 和 DateTime.Now 都已正确更新

c# android nodatime
1个回答
0
投票

TzdbDateTimeZoneSource
不执行任何缓存 - 它获取
TimeZoneInfo.Local.Id
并映射它。

所以我期望调用

TimeZoneInfo.ClearCachedData()
就足够了,只要更新
TimeZoneInfo.Local.Id

换句话说,如果你跑步:

Log(TimeZoneInfo.Local.Id);
Log(DateTimeZoneProviders.Tzdb.GetSystemDefault().Id);

// Pause and adjust the system default time zone.
// Then:

TimeZoneInfo.ClearCachedData();
Log(TimeZoneInfo.Local.Id);
Log(DateTimeZoneProviders.Tzdb.GetSystemDefault().Id);

...我希望看到一致性,例如“美国/纽约”两次,然后“美国/丹佛”两次。

如果您看到“America/New_York”四次,则意味着

TimeZoneInfo.ClearCachedData()
实际上并未更新本地时区 ID。

如果您看到“America/New_York”两次,然后是“America/Denver”,然后是“America/New_York”,那么这将是野田时间中的一个错误 - 但假设您使用的是最新版本,我不能轻易地看看那会如何发生。 (

DateTimeZoneCache
不缓存
GetSystemDefault()
的结果,
TzdbDateTimeZoneSource
也不缓存。)

© www.soinside.com 2019 - 2024. All rights reserved.