NodaTime 中存在的 lat/lon 数据来自 Olson 数据中的zone.tab文件。这给出了该区域用作参考的地图上点的位置。
如果这是您唯一可用的数据,那么对于任意位置,您能做的最好的事情就是找到最近的点。在某些情况下,这将为您提供准确的时区,但在许多情况下不会。
考虑下面的例子(请原谅我糟糕的艺术作品)
这两个方块代表不同的时区,其中每个方块中的黑点是参考位置,例如您可以在 zone.tab 中找到的位置。蓝点表示您要传递给输入查询的位置。显然,这个位置在左侧的橙色区域内,但如果我们只看离参考点最近的距离,它将解析为右侧的绿色区域。
所以 zone.tab 数据(例如在 Noda Time 中找到的)不足以执行此操作。相反,我们需要根据定义区域边界的形状来描述区域,而不仅仅是单个点。幸运的是,Eric Muller 非常好心地提供了这些形状并将它们置于公共领域。您可以在此处找到此数据。
您找到的我的Raven.TimeZones项目正是这样做的。它从 Eric 的 shapefile 导入数据,并使用 RavenDB 的地理空间特征来索引和查询该数据。
您当然可以直接使用我的实现,或者从中复制您需要的任何部分。它完全脱机工作,不进行网络服务调用。但它确实需要 RavenDB 的许可才能运行。
如果您无法使用 RavenDB,您可以使用任何其他支持复杂空间查询的数据库采取类似的方法。
特别是 - RavenDB 目前无法在纯 WinRT 环境中运行,因此您将无法直接在 Windows 应用商店应用程序中使用它。我不确定是否有任何可以执行地理空间查询的 WinRT 嵌入式数据库。如果有人知道的话,请告诉我们。
更新
可以在此处找到时区查找方法的综合列表。