Вывести время по широте/долготе?

Здесь сделка. У меня есть широта/долгота. Мне нужно выяснить, какое сейчас время находится в этом месте. Вот как я это делал раньше:

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

Однако я понял, что это даст время для текущего местоположения пользователя. Есть ли где-нибудь API, который дает мне время на основе пары lat/lon?

Спасибо заранее.

5 ответов

К сожалению, часовые пояса (и время вообще) никогда не так просты, как вы хотели бы.

Для простого приближения вы можете следовать предложению jer. Долгота колеблется от -180 до 180 градусов, есть 24 часа в сутки, поэтому вы получаете 15 градусов долготы за часовую зону. Центрируйте эти часовые пояса на 0 градусов по долготе, поэтому UTC простирается от -7,5 до 7,5, UTC + 1 составляет от 7,5 до 22,5, UTC-1 - от -7,5 до -22,5 и т.д. Тогда у вас будет очень упрощенная и неправильная модель того, как мы используем часовые пояса.

Посмотрите на эту карту часовых поясов.

  • Часовой пояс не упорядочен; регионы в UTC-1 прилегают к регионам в UTC-3.
  • UTC-9.5, UTC-4.5, UTC + 3.5, UTC + 5.75 и UTC + 13 - все действующие часовые пояса и активно используются.

Как только вы это выясните, вы можете приступить к рассмотрению летнего времени.


Нет, вам придется написать один. Поскольку точки широты и долготы хорошо известны, а часовые пояса также хорошо известны (хотя и периодически меняются), все, что вам нужно сделать, это карта, в которой ползунок lat/long находится в заданных часовых поясах, и вычисляет, находится ли ваша текущая позиция, в которой из этих ящиков. Как только вы узнаете, в каком поле вы находитесь, у вас будет достаточно информации, чтобы выяснить, что ваше время.


Это не тривиальная проблема, но она не одна без решения. Такие услуги, как Geonames и WeatherBug, являются очень ограничительными и/или дорогостоящими, поэтому не начинайте что-то развивать, прежде чем вы полностью поймете их условия обслуживания.

Вот шаги, которые я выполнил для своего iPhone-приложения на базе Appcelerator:

  • Найдите список координат, которые описывают все временные интервалы как полигоны и читают их в таблице SQLite.
  • Сделайте наилучшее представление о том, какой часовой пояс пользователь находится (или ищет), исходя из долготы. Это будет несколько зон.
  • Потяните многоугольники каждого из наиболее подходящих часовых поясов из базы данных и запустите их каждый через алгоритм find-point-in-polygon. Тот, который возвращает true, является правильным часовым поясом.

Если вы не беспокоитесь о летнем времени, вы закончите, иначе у вас будет беспорядок. Пейзаж DST совершенно нелогичен и часто меняется. Лучшее, что я мог сделать, это Google "Правила летнего времени" (смотрите здесь: Источники для часовых поясов и данных о летнем времени) и подготовленный для того, чтобы сделать большой список настройки работы, который вы можете использовать для расчета. Моя работа по-прежнему не работает отлично после многократной настройки.


Используйте этот дамп данных и импортируйте его в свою программу. Затем найдите страну, в которой находится ваш lat/long, и часовой пояс. Затем вы можете рассчитать, какое время оно находится на конкретном lat/lon.

Geonames


Я написал небольшой класс Java, чтобы сделать это, с данными, встроенными в код. Его можно легко перевести в ObjectiveC. База данных встроена в сам код. Он точно до 22 км.

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

licensed under cc by-sa 3.0 with attribution.