我正在使用webread()函数从sunrise-sunset.org api here中检索日出和日落数据。
这是我的代码:
function [E_total] = solar_energy(lng, lat, yr, month, day)
% Generate URL
url = strcat('https://api.sunrise-sunset.org/json?lat=', num2str(lat),...
'&lng=', num2str(lng), '&date=', num2str(yr), '-', num2str(month),...
'-',num2str(day));
% Retrieve data
forecast = webread(url)
if isempty(forecast) % Failed, use default estimates
sunrise = 6;
sunset = 18;
noon = 12;
elseif forecast.status == 'OK'
% Success! Parse retrieved data...
forecast.results
dv = datevec(forecast.results.sunrise)
sunrise = dv(6)/3600 + dv(5)/60 + dv(4)
dv = datevec(forecast.results.sunset)
sunset = dv(6)/3600 + dv(5)/60 + dv(4)
dv = datevec(forecast.results.solar_noon)
noon = dv(6)/3600 + dv(5)/60 + dv(4)
end
以下是我在华盛顿国家纪念碑拍摄的日出和日落数据的示例。
输入:
solar_energy(-77.0353,38.8895,2017,12,20)
这是我得到的:
预测=
results: [1x1 struct] status: 'OK'
ans =
sunrise: '12:00:01 AM' sunset: '12:00:01 AM' solar_noon: '9:38:38 AM' day_length: '00:00:00' civil_twilight_begin: '12:00:01 AM' civil_twilight_end: '12:00:01 AM' nautical_twilight_begin: '12:00:01 AM' nautical_twilight_end: '12:00:01 AM' astronomical_twilight_begin: '12:00:01 AM' astronomical_twilight_end: '12:00:01 AM'
我的方法有什么问题或者这个api有问题吗? 数据检索成功,但是对于所有日期,日出和日落时间要么是上午12:00:00,要么是9时AM。
答案 0 :(得分:1)
好的,我想我发现了你的问题。我看了一下API documentation,发现它支持一个名为formatted
的附加参数,其描述如下:
格式化(整数):0或1(默认为1)。响应时间值 将按照ISO 8601表示,并表示day_length 很快。可选的。
我尝试将其附加到您在函数中创建的请求中。与此同时,我还解决了您在通话中使用date parameter
的一个小问题:
日期(字符串):YYYY-MM-DD格式的日期。也接受其他日期 格式甚至相对日期格式。如果不存在,则默认为日期 到目前的日期。可选的。
' DD'天数格式以两位数表示日期值(例如:如果日值为21
则为21
,如果日值为02
则为2
)。自num2str
和num2str(2) = '2'
起,使用num2str(02) = '2'
不会重现此行为。快速解决方法是使用datestr(day,'dd')
代替。
以下是最终结果:
solar_energy(-77.0353, 38.8895, 2017, 12, 02);
function [E_total] = solar_energy(lng, lat, yr, month, day)
url = strcat('https://api.sunrise-sunset.org/json', ...
'?lat=', num2str(lat), ...
'&lng=', num2str(lng), ...
'&date=', num2str(yr),'-',num2str(month),'-',datestr(day,'dd'), ...
'&formatted=0');
forecast = webread(url);
if (isempty(forecast) || ~strcmp(forecast.status,'OK'))
sunrise = 6;
noon = 12;
sunset = 18;
else
forecast.results
end
end
这是上面代码产生的结果:
sunrise: '2017-12-02T12:09:28+00:00' sunset: '2017-12-02T21:46:20+00:00' solar_noon: '2017-12-02T16:57:54+00:00' day_length: 34612 civil_twilight_begin: '2017-12-02T11:40:03+00:00' civil_twilight_end: '2017-12-02T22:15:44+00:00' nautical_twilight_begin: '2017-12-02T11:06:58+00:00' nautical_twilight_end: '2017-12-02T22:48:50+00:00' astronomical_twilight_begin: '2017-12-02T10:34:47+00:00' astronomical_twilight_end: '2017-12-02T23:21:01+00:00'
如您所见,返回的值看起来正确。所以问题是由API
如何处理它从ISO 8601
中的数据库检索的日期到另一种格式的转换。
当然,您必须更改当前正在解析API
返回的值的方式。这应该做的工作:
datevec(struct.sunrise,'yyyy-mm-ddTHH:MM:ss');