【问题标题】:Figure out time by latitude/longitude?按纬度/经度计算时间?
【发布时间】:2011-01-08 02:59:53
【问题描述】:

这是交易。我有一个位置的纬度/经度集。我需要弄清楚该位置的当前时间。这是我之前得到它的方式:

NSDateFormatter *theFormatter = [[NSDateFormatter alloc] init];
[theFormatter setDateFormat:@"h:mm a"];
NSDate *todaysdate = [NSDate date];
NSString *todaysDate = [theFormatter stringFromDate:todaysdate];
[theFormatter release];

但是,我意识到这将为用户的当前位置提供时间。是否有某个 API 可以根据纬度/经度对为我提供时间?

提前致谢。

【问题讨论】:

标签: iphone objective-c cocoa-touch time


【解决方案1】:

不幸的是,时区(以及一般的时间)从来没有你想的那么简单。

对于一个简单的近似值,您可以遵循 jer 的建议。经度范围从 -180 度到 180 度,一天有 24 小时,因此每个时区得到 15 度的经度。将这些时区置于经度 0 度的中心,因此 UTC 从 -7.5 延伸到 7.5,UTC+1 从 7.5 延伸到 22.5,UTC-1 从 -7.5 延伸到 -22.5,依此类推。这样你就会有一个关于我们如何使用时区的非常简单和错误的模型。

看看这个map of time zones

  • 时区排序不合理; UTC-1 中的区域与 UTC-3 中的区域相邻。
  • UTC-9.5、UTC-4.5、UTC+3.5、UTC+5.75 和 UTC+13 都是有效时区,并且正在积极使用中。

一旦你解决了这个问题,你就可以开始考虑夏令时了。

【讨论】:

  • 感谢您的详细回答。我认为这太复杂和混乱,无法自己解决。我将只使用 Wea​​therBug 的 API,它为我提供了纬度/经度对的时间(和其他信息)。它需要 n/w 访问权限,但我的应用程序无论如何都需要它,所以它不会有太大的不同。
  • 你也可以使用AskGeo(objC绑定gist.github.com/907603)。干杯!
【解决方案2】:

不,你必须写一个。由于纬度和经度点是众所周知的,并且时区也是众所周知的(尽管会定期更改),您所要做的就是在给定时区中绘制纬度/经度框的位置,并计算您当前的位置是否在哪个时区那些盒子。一旦你知道你在哪个盒子里,你就会有足够的信息来弄清楚你的时间是什么。

【讨论】:

  • 感谢您的回答。我在某处发现了这个:offset = direction * longitude * 24 / 360。有道理,就是不知道怎么用。会不会和NSTimeZone有关?
  • @sudo 请记住,我很确定时区不会遵循地球上的完美线条。他们有时会做一些非常奇怪的事情,这意味着任何普通人看着一个国家都会认为它是 GMT+1,但无论出于“委员会”决定的任何原因,它都可能是 GMT+2。
  • @Andrew 很高兴知道,谢谢!出于我的目的,我认为在那些有问题的时区中保持那么精确并不重要。但是,我仍然不知道如何使用这个偏移量。 :)
【解决方案3】:

这不是一个微不足道的问题——但也不是没有解决方案的问题。 Geonames 和 WeatherBug 等服务的限制非常严格和/或成本很高,因此在您彻底了解他们的服务条款之前不要开始开发。

以下是我为基于 Appcelerator 的 iPhone 应用程序所遵循的步骤:

  1. 找到将所有时区描述为多边形的坐标列表,并将它们读入 SQLite 表。
  2. 根据经度对用户所处(或正在寻找)的时区做出最佳猜测。这将是几个区域。
  3. 从数据库中提取每个最佳猜测时区的多边形,并通过多边形中的查找点算法运行每个多边形。返回 true 的是正确的时区。

如果您不关心夏令时,那么您就完成了,否则,您将面临一团糟。 DST 的格局完全不合逻辑,并且经常变化。我能做的最好的就是谷歌“夏令时规则”(从这里开始:Sources for Time Zone and Daylight Saving Time Data),并准备做很多工作来设置你可以用来计算的列表。我的仍然经过大量调整后无法完美运行。

【讨论】:

  • 我早就解决了这个问题,但感谢您分享您的经验。
【解决方案4】:

使用此数据转储并将其导入您的程序。然后找到您的纬度/经度所在的国家和时区。然后,您可以计算特定纬度/经度的时间。

Geonames

【讨论】:

    【解决方案5】:

    为此,我编写了一个小型 Java 类,其中数据嵌入在代码中。它可以很容易地翻译成ObjectiveC。数据库嵌入在代码本身中。精确到 22 公里。

    https://sites.google.com/a/edval.biz/www/mapping-lat-lng-s-to-timezones

    【讨论】:

      猜你喜欢
      • 2010-09-28
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      相关资源
      最近更新 更多