我正在尝试创建一个返回给定机场代码(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
功能所需数据的公开列表?
答案 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