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



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

函数应该做的是这样的事情:

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

为了实现这个功能,我需要一个所有aiport代码及其时区的列表。

通过搜索,我找到了这个列表:https://sourceforge.net/p/openflights/code/HEAD/tree/openflights/data/airports.dat?format=raw(来源:http://openflights.org/data.html)

在列表中查找了几个机场代码后,我发现有些数据不正确。例如,它列出了CXIUTC -12时区中——根据本页,这是不正确的。

你们中有人知道一个公共列表,它提供了使getTimezoneFromAirportCode发挥作用所需的数据吗?

由于问题仍然悬而未决,我想指出我自己的时区地图文件。对于您的特定目的,IATA的tzmap似乎是完美的:

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

显然,您必须从zoneinfo文件中获取有问题的偏移量(这取决于日期,因为它可能会随着时间的推移而变化),例如使用zdump(1)

您混淆了一个"时区";用一个";"时区偏移";。它们不是一回事。你不能只要求某个地点的偏移量,你还需要知道有问题的具体时间。要求";洛杉矶国际机场的时区偏移量是多少因为冬天是-8,而夏天是-7。

你可以问";现在这个位置的偏移量是多少";,但这可能会给你一个不同的答案,这取决于你问的时间。因此,日期和时间必须是输入的一部分。

相反,您真正需要知道的是LAX对应于America/Los_Angeles的IANA时区。这些时区代码被PHP日期/时间API和许多其他系统所理解。(.NET Windows用户可以使用我的TimeZoneConverter库将这些时区转换为Microsoft Windows时区。)

要做到这一点,您需要获取每个机场的纬度和经度(可从OpenFlights和许多其他地方获得),并使用此处描述的方法之一查找这些坐标的IANA时区。

我已经在C#中为此编写了代码,您可以在这里找到。输出包含在.csv文件中,您可以解析该文件并用任何您喜欢的语言使用。它包括IANA和Microsoft时区。

一定要阅读时区标签wiki,尤其是IANA数据库上的部分,以及标题为";时区!=偏移";。

还要注意的是,虽然OpenFlights数据库中的lat/lon坐标很好,但该文件中的时区数据不是很准确,因此完成我描述的过程很重要。当涉及到时区的具体情况时,您应该只信任IANA数据库,并确保不断更新。

我设法找到了这个问题的解决方案。通过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

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

我发现以下链接包含一个CSV文件,其中包含5000多个机场代码及其相对于UTC的时区。

http://openflights.org/data.html

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

我推荐FAA的"NASR"数据库,这是FAA提供的56天数据集。数据库是一组使用固定宽度ASCII列的原始文本文件。提供了显示每列内容的格式描述文件。

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

请注意,这是美国联邦航空管理局提供的"官方"原始导航数据产品。可以说,这是"出自马之口"。

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

相关内容

  • 没有找到相关文章

最新更新