Как получить часовой пояс из кода аэропорта (IATA/FAA)

Я пытаюсь сделать функцию PHP, которая возвращает часовой пояс UTC для данного кода аэропорта (IATA/FAA).

что функция должна делать что-то вроде этого:

echo getTimezoneFromAirportCode("CPH"); // +1
echo getTimezoneFromAirportCode("CXI"); // +14

чтобы сделать эту функцию, мне нужен список всех кодов аэропортов и их часовых поясов.

при поиске немного я нашел этот список: https://sourceforge.net/p/openflights/code/HEAD/tree/openflights/data/airports.dat?format=raw (Источник: http://openflights.org/data.html)

после просмотра нескольких кодов аэропорта в списке я узнал, что некоторые из данных были неправильными. Например, он перечисляет CXI в UTC -12 часовой пояс - который согласно на этой странице некорректно.

кто-нибудь из вас знает открытый список, который предоставляет данные, необходимые для создания ?

5 ответов


видя, что вопрос все еще открыт, я хотел бы указать на мой собственный файлы карт часового пояса. Для вашей конкретной цели IATA tzmap кажется идеальным:

https://raw.github.com/hroptatyr/dateutils/tzmaps/iata.tzmap

очевидно, вам нужно будет снять смещение в вопросе (это зависит от даты, поскольку она может измениться со временем) из файлов zoneinfo, например, с zdump(1).


Вы путаете "часовой пояс" с "смещение часового пояса". Это не одно и то же. Вы не можете просто попросить смещение в месте - вам также нужно будет знать конкретное время, о котором идет речь. Недопустимо спрашивать "каково смещение часового пояса для LAX" - потому что зимой оно будет -8, а летом -7.

Вы можете спросить: "Что такое смещение в этом месте прямо сейчас", но это может дать вам другой ответ в зависимости от того, когда ты спрашиваешь. Таким образом, дата и время должны быть частью ввода.

что вам действительно нужно знать, так это то, что LAX соответствует часовой пояс IANA of America/Los_Angeles. Эти коды часовых поясов понимаются PHP дата/время API, и многие другие системы.

для этого вам нужно взять широту и долготу каждого аэропорта (которые доступны из OpenFlights и многих других мест) и использовать один из описанных методов вот!--10--> для поиска часового пояса IANA для этих координат.

Я уже написал код для этого в C#что вы можете найти здесь. Выход включен в .csv-файл, который вы можете анализировать и использовать на любом языке.

Не забудьте также прочитать тег часового пояса wiki, особенно части базы данных IANA и раздел под названием " часовой пояс != Смещение."

также обратите внимание, что в то время как координаты lat/lon в База данных OpenFlights великолепна, данные часового пояса в этом файле не очень точны, поэтому важно пройти процесс, который я описал. Когда дело доходит до специфики часовых поясов, вы должны доверять только базе данных IANA и следить за обновлением.


Хммм..возможно, вы можете сделать конвертер самостоятельно - он должен быть достаточно простым с небольшой таблицей базы данных, отображающей коды аэропортов в часовые пояса.

Я нашел следующую ссылку, содержащую CSV-файл с более чем 5000 кодов аэропортов и их часовой пояс относительно UTC.

http://openflights.org/data.html

вы можете импортировать CSV из этой ссылки в свою собственную базу данных, а затем ваш код работает вокруг часовых поясов и аэропортов в этом таблица.


Я бы рекомендовал база данных "NASR" FAA, который является 56-дневным набором данных, предоставленным FAA. База данных представляет собой набор необработанных текстовых файлов с использованием столбцов ASCII фиксированной ширины. Предоставляются файлы описания формата, которые показывают, что такое каждый столбец.

один из файлов в наборе данных APT.txt который содержит поле часового пояса для каждого аэропорта; см. описание формата для APT.txt чтобы найти смещения столбцов. Это может показаться пугающим, но это очень легко разбор.

Обратите также внимание, что это "официальный" продукт необработанных навигационных данных, предлагаемый FAA. Это "из первых уст" так сказать.

[EDIT: эта база данных охватывает только аэропорты США; см. комментарии ниже.]


мне удалось найти решение этой проблемы. Через flightstats.com API можно получить бесплатный, но ограниченный доступ к полной базе данных аэропорта:https://developer.flightstats.com/api-docs/airports/v1

API возвращает все активные/неактивные аэропорты в следующем формате:

{
   "fs": "LAX",
   "iata": "LAX",
   "icao": "KLAX",
   "faa": "LAX",
   "name": "Los Angeles International Airport",
   "street1": "One World Way",
   "street2": "",
   "city": "Los Angeles",
   "cityCode": "LAX",
   "stateCode": "CA",
   "postalCode": "90045-5803",
   "countryCode": "US",
   "countryName": "United States",
   "regionName": "North America",
   "timeZoneRegionName": "America/Los_Angeles",
   "weatherZone": "CAZ041",
   "localTime": "2014-06-20T06:00:50.439",
   "utcOffsetHours": -7,
   "latitude": 33.943399,
   "longitude": -118.408279,
   "elevationFeet": 126,
   "classification": 1,
   "active": true,
   "delayIndexUrl": "https://api.flightstats.com/flex/delayindex/rest/v1/json/airports/LAX?codeType=fs",
   "weatherUrl": "https://api.flightstats.com/flex/weather/rest/v1/json/all/LAX?codeType=fs"
}

Это были именно те данные, которые мне нужны, чтобы сделать мою функцию:

echo getTimezoneFromAirportCode("LAX"); // -7

данные доступны через следующий GET запрос:

https://api.flightstats.com/flex/airports/rest/v1/json/all?appId=[appId]&appKey=[appKey]

[appId] и [appKey] будет предоставлен после создания бесплатного flightstats.com учетная запись разработчика здесь:https://developer.flightstats.com/signup