我怎样才能让Xamarin的Noda Time回归"America/Los_Angeles"?

Gar*_*yer 2 c# timezone nodatime xamarin

我正在使用Noda Time在Xamarin Forms中获取设备上的本地时区.我们使用下面的代码返回它.

NodaTime.DateTimeZoneProviders.Tzdb.GetSystemDefault().Id;
Run Code Online (Sandbox Code Playgroud)

但是,如果您将手机的位置设置为美国西海岸的任何地方,则会返回"America/Tijuana".这对我们造成了一个问题,当你的位置设置为LA时,如果它返回类似"America/Los_Angeles"(这是一个有效的Id)的东西就可以解决

有什么想法吗?如何让库返回更准确的ID?

Jon*_*eet 8

在某些平台上,根据您使用的Noda Time的版本,系统时区的ID不可用,因此我们必须猜测.我们这样做是基于从当年1月1日到5年1月1日的时区过渡.(这是生产代码中唯一使用系统时钟的地方.)

我们询问TimeZoneInfo其在该时间间隔内的许多不同时刻的UTC偏移的概念(任何 IANA时区都有转换的每个时刻).然后,我们根据TimeZoneInfo值对每个IANA时区进行"评分" ,以查看当前UTC的多少比例返回相同的UTC偏移量.我们返回具有最高匹配数的时区的ID,只要它至少占其中的70%.

在您的情况下,美国/蒂华纳和美国/洛杉矶都有相同的过渡期,为2018年至2022年的5年.以tzvalidate格式:

2018-03-11 10:00:00Z -07:00:00 daylight PDT
2018-11-04 09:00:00Z -08:00:00 standard PST
2019-03-10 10:00:00Z -07:00:00 daylight PDT
2019-11-03 09:00:00Z -08:00:00 standard PST
2020-03-08 10:00:00Z -07:00:00 daylight PDT
2020-11-01 09:00:00Z -08:00:00 standard PST
2021-03-14 10:00:00Z -07:00:00 daylight PDT
2021-11-07 09:00:00Z -08:00:00 standard PST
2022-03-13 10:00:00Z -07:00:00 daylight PDT
2022-11-06 09:00:00Z -08:00:00 standard PST
Run Code Online (Sandbox Code Playgroud)

Noda Time无法区分该5年期间的两个时区,因此它返回首先找到的时区.(它是未定义的,它首先找到哪一个 - 这是我们可能想要通过按ID排序时区来解决的问题.我将为此提出问题.)

我希望这有助于解释你所看到的内容 - 它不能解决问题,但它表明所有代码(你的和Noda Time)在可用信息有限的情况下表现得相当合理.

正如评论所说,你可能需要使用特定于平台的代码来解决此问题:在.Name财产Foundation.NSTimeZone.LocalTimeZone上的iOS和可能的.ID财产Java.Util.TimeZone.Default在Android上.