Я пытаюсь сделать функцию 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
который по этой странице неверен.
Кто-нибудь из вас знает публичный список, который предоставляет данные, необходимые для создания функции getTimezoneFromAirportCode
?
Увидев, что вопрос по-прежнему открыт, я хотел бы указать на мои собственные файлы карт часового пояса . Для вашей конкретной цели IATA tzmap кажется идеальным:
https://raw.github.com/hroptatyr/dateutils/tzmaps/iata.tzmap
Очевидно, что вам нужно было бы сгладить рассматриваемое смещение (это зависит от даты, поскольку оно может меняться со временем) из файлов zoneinfo, например, с помощью zdump(1)
.
Вы смешиваете «часовой пояс» с «смещением часового пояса». Это не одно и то же. Вы не можете просто запросить смещение в месте нахождения – вам также нужно знать конкретное время, о котором идет речь. Недействительно задавать вопрос: «Что такое часовой пояс для LAX», потому что зимой будет -8, а летом это будет -7.
Вы можете спросить «что такое смещение в этом месте прямо сейчас », но это может дать вам другой ответ в зависимости от того, когда вы спросите. Таким образом, дата и время должны быть частью ввода.
То, что вам действительно нужно знать, это то, что LAX
соответствует America/Los_Angeles
IANA в America/Los_Angeles
. Эти коды часовых поясов понимаются API-интерфейсом даты и времени PHP и многими другими системами.
Для этого вам необходимо выбрать широту и долготу каждого аэропорта (которые доступны из OpenFlights и многих других мест) и использовать один из методов, описанных здесь, для поиска часового пояса IANA для этих координат.
Обязательно прочтите также wiki темы часового пояса , особенно части базы данных IANA, и раздел «Часовой пояс! = Смещение».
Также обратите внимание, что данные часового пояса, которые вы найдете в базе данных OpenFlights (и несколько других там), не очень точны. Когда дело доходит до специфики часовых поясов, вы должны доверять только базе данных IANA и следить за обновлениями.
Хм … возможно, вы можете сделать конвертер самостоятельно – он должен быть достаточно простым, если небольшая таблица базы данных отображает коды аэропортов на временные интервалы.
Я нашел следующую ссылку, содержащую CSV-файл, содержащий более 5000 кодов аэропортов и их часовой пояс относительно UTC.
http://openflights.org/data.html
Вы можете импортировать CSV из этой ссылки в свою собственную базу данных, а затем заставить свой код работать с часовыми поясами и аэропортами в этой таблице.
Я бы рекомендовал базу данных FAA «NASR» , которая представляет собой 56-дневный набор данных, предоставленный FAA. База данных представляет собой набор необработанных текстовых файлов с использованием столбцов ASCII с фиксированной шириной. Предоставляются файлы описания формата, которые показывают, что такое каждый столбец.
Одним из файлов в этом наборе данных является APT.txt
который содержит поле часового пояса для каждого аэропорта; см. описание формата для APT.txt
чтобы найти смещения столбца. Это может показаться пугающим, но это очень легко разобрать.
Также обратите внимание, что это «официальный» продукт навигационных данных, предлагаемый FAA. Это «из уст лошади», так сказать.
[EDIT: эта база данных охватывает только аэропорты США; см. комментарии ниже.]
Мне удалось найти решение проблемы. Через API FlightStats.com можно получить бесплатный, но ограниченный доступ к полной базе данных аэропорта: 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