如何从机场代码(IATA / FAA)获取时区

时间:2013-12-12 20:18:01

标签: php timezone

我正在尝试创建一个返回给定机场代码(IATA / FAA)的UTC时区的PHP函数。

这个功能应该是这样的:

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时区 - 根据this page不正确。

您是否知道提供getTimezoneFromAirportCode功能所需数据的公开列表?

5 个答案:

答案 0 :(得分:17)

看到问题仍然存在,我想指出我自己的timezone map files。出于特定目的,IATA tzmap似乎很完美:

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

显然,您必须从zoneinfo文件中查询有问题的偏移(它取决于可能随时间变化的日期),例如:与zdump(1)

答案 1 :(得分:8)

你混淆了一个"时区"带有"时区偏移"。它们不是同一件事。您无法在某个位置询问偏移量 - 您还需要知道相关的具体时间。询问" LAX"的时区偏移是什么,这是无效的。 - 因为在冬天它将是-8,而在夏天它将是-7。

您可以询问"此位置现在"的偏移量是多少,但根据您的要求,这可能会给您一个不同的答案。所以日期和时间必须是输入的一部分。

您真正需要知道的是LAX对应America/Los_Angeles的{​​{3}}。 IANA time zone和许多其他系统可以理解这些时区代码。 (.NET Windows用户可以使用我的the PHP date/time API库将这些转换为Microsoft Windows时区。)

为此,您需要获取每个机场的纬度和经度(可从OpenFlights和许多其他地方获得),并使用TimeZoneConverter查找IANA时区以获取这些坐标。

我已经在C#中编写了代码,one of the methods described here。输出包含在.csv文件中,您可以使用您喜欢的任何语言进行解析和使用。它包括IANA和Microsoft时区。

请务必阅读which you can find here,尤其是IANA数据库中的部分,以及标题为“#34;时区!=偏移"”的部分。

另请注意,虽然OpenFlights数据库中的纬度/经度坐标很好,但该文件中的时区数据不是很准确,因此完成我描述的过程非常重要。当涉及到时区的细节时,您应该只信任IANA数据库并确保您不断更新。

答案 2 :(得分:2)

嗯......也许你自己可以制作一个转换器 - 它应该很简单,只需要一个小的数据库表,将机场代码映射到时区。

我发现以下链接包含超过5,000个机场代码的CSV文件及其相对于UTC的时区。

http://openflights.org/data.html

您可以将该链接中的CSV导入到您自己的数据库中,然后让您的代码围绕该表中的时区和机场运行。

答案 3 :(得分:2)

我会推荐FAA's "NASR" database,这是美国联邦航空局提供的56天数据集。数据库是一组使用固定宽度ASCII列的原始文本文件。提供格式描述文件,显示每列的内容。

该数据集中的一个文件是APT.txt,其中包含每个机场的时区字段;请参阅APT.txt的格式说明以查找列偏移量。这可能听起来令人生畏,但它很容易解析。

另请注意,这是美国联邦航空局提供的“官方”原始导航数据产品。它可以说是“从马的嘴里”。

[编辑:此数据库仅涵盖美国机场;见下面的评论。]

答案 4 :(得分:2)

我设法找到问题的解决方案。通过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]
在此处创建免费的flightstats.com开发者帐户后,将提供

[appId][appKey]https://developer.flightstats.com/signup