由于NodaTime已经在olson数据库中有纬度/经度和国家代码数据,我想知道我们是否可以指定任何纬度/经度(比如GeoLocator.GetGeopositionAsync在Windows应用商店应用中返回的任何纬度/经度)并确定时区和它的国家代码?
类似于此内容:var zone = session.GetZoneForLocation(latitude, longitude);
这来自https://github.com/mj1856/Raven.TimeZones
我特别关注像NodaTime这样的离线解决方案,而不是使用网络服务。
答案 0 :(得分:6)
NodaTime中存在的lat / lon数据来自Olson数据中的zone.tab文件。这会在地图上提供点的位置,并将其用作参考。
如果这是您可用的唯一数据,那么您可以为任意位置做的最好的事情就是找到最近的点。在一些的情况下,这将为您提供准确的时区,但在许多情况下它不会。
请考虑以下示例(请原谅我可怜的艺术作品)
两个方块代表不同的时区,每个方块中的黑点是参考位置,例如您在zone.tab中找到的位置。蓝点表示您要传递给输入查询的位置。显然,这个位置在左边的橙色区域内,但是如果我们只看到距离参考点的最近距离,它将会解析到右边的绿色区域。
因此,zone.tab数据(例如在Noda Time中找到)不足以执行此操作。相反,我们需要根据定义边界的形状来描述区域,而不仅仅是单个点。幸运的是,Eric Muller非常善于提供这些形状并将它们置于公共领域。 You can find this data here
您找到的Raven.TimeZones项目正是如此。它从Eric的shapefile导入数据,并使用RavenDB的地理空间特征来索引和查询数据。
您当然可以直接使用我的实现,或者从中复制您需要的任何部分。它完全脱机工作,不进行Web服务调用。但它确实需要RavenDB的许可才能运行。
如果您无法使用RavenDB,您可以使用支持复杂空间查询的任何其他数据库采用类似的方法。
特别是 - RavenDB目前无法在纯WinRT环境中运行,因此您无法在Windows应用商店应用中直接使用它。我不确定是否有任何可以执行地理空间查询的WinRT嵌入式数据库。如果有人知道是否有,请告诉我们。
<强>更新强>
A consolidated list of time zone lookup methods can be found here.