今天我遇到个问题。我在编写代码处理 NOAA 的潮汐站 XML 文档时,很快意识到我遇到了麻烦。这是一小段 XML 文档:
<timezone>LST/LDT</timezone>
<item>
<date>2013/01/01</date>
<day>Tue</day>
<time>02:06 AM</time>
<predictions_in_ft>19.7</predictions_in_ft>
<predictions_in_cm>600</predictions_in_cm>
<highlow>H</highlow>
</item>
如果您注意到 timezone 标签,它代表当地标准时间/当地日时。这是一个真实存在的问题因为您需要用 UTC 格式存储这些数据。如果没有正确的时区我就会迷失。我的生意伙伴抓了我的头后,给我看了俩个使用经纬度位置并返回时区信息的 API。很幸运,每个潮汐站我都有经纬度位置信息。
如果您打开这个网页您就能读到这个 Google's Timezone API 文档:
https://developers.google.com/maps/documentation/timezone/
这个 API 相当简单。它需要一个位置,时间戳和一个标志来识别请求的应用是否正在使用传感器(如 GPS 设备)来确定位置。
这是一个简单的 Google API 调用和响应:
https://maps.googleapis.com/maps/api/timezone/json?location=38.85682,-92.991714&sensor=false×tamp=1331766000
{
"dstOffset" : 3600.0,
"rawOffset" : -21600.0,
"status" : "OK",
"timeZoneId" : "America/Chicago",
"timeZoneName" : "Central Daylight Time"
}
它限制一天只能访问2500次。对于我的潮汐站初始加载,我知道我将达到这个限制,而且我不想等几天再加载所有数据。所有我的商业伙伴从 GeoNames 发现了这个 timezone API。
如果您打开这个网页您就能读到这个 GeoNames's API 文档:
http://www.geonames.org/export/web-services.html#timezone
这个 API 需要一个免费帐号,它相当快就可以设置好。一旦您激活您的帐号,为了使用这个 API您需要找到帐号页去激活您的用户名。
这是一个简单的 GeoNames API 调用和响应:
http://api.geonames.org/timezoneJSON?lat=47.01&lng=10.2&username=demo
{
"time":"2013-08-09 00:54",
"countryName":"Austria",
"sunset":"2013-08-09 20:40",
"rawOffset":1,
"dstOffset":2,
"countryCode":"AT",
"gmtOffset":1,
"lng":10.2,
"sunrise":"2013-08-09 06:07",
"timezoneId":"Europe/Vienna",
"lat":47.01
}
这个 API 返回的信息多一些。而且没有访问限制但是响应时间不能保证。目前我访问了几千次没有遇到问题。
至此我们有两个不同的 web 请求能帮我们获得 timezone 信息。让我们看看怎么使用 Go 去使用 Google web 请求并获得一个返回对象用在我们的程序中。
首先,我们需