我正在尝试制作一个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)
在列表中查找了几个机场代码后,我发现有些数据不正确。例如,它列出了CXI
在UTC -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
的格式描述以查找列偏移。这听起来可能很吓人,但很容易解析。
请注意,这是美国联邦航空管理局提供的"官方"原始导航数据产品。可以说,这是"出自马之口"。
[编辑:此数据库仅涵盖美国机场;请参阅下面的评论。]