我正在开发一个基于邮政编码返回大量优质信息的API - 但我遇到了date_sun_info
的问题,只有在我调用date_diff
时才会发生问题。 (当然我也尝试过使用DateTime::diff
,但更简单的问题标题是程序版本,它会导致有趣的结果。不需要外部库的重新创建的代码如下:
$suninfo=array();
$ret=array();
$suninfo = date_sun_info(time(), "47.627102", "-122.637299");
$sun=array();
foreach($suninfo as $key => $tstamp) {
$sun[$key] = date("H:i:s", $tstamp);
}
$ret['suninfo'] = $sun;
$ret['raw'] = $suninfo;
$sunrise = (int)$suninfo['sunrise'];
//$sunrise = date_sunrise(time(), SUNFUNCS_RET_TIMESTAMP, $res['latitude'], $res['longitude']);
$sunset = (int)$suninfo['sunset'];
//$sunset = $sunrise = date_sunset(time(), SUNFUNCS_RET_TIMESTAMP, $res['latitude'], $res['longitude']);
$d1 = new DateTime("@{$sunrise}");
$d2 = new DateTime("@{$sunset}");
$dif = date_diff($d2, $d1, true); //$d2->diff($d1);
$length = $dif->format("%h:%i");
$ret['dayLength'] = $length;
echo "<pre>". print_r($ret, true) ."</pre>";
相关代码会在第一页加载时生成正确的结果:
Array
(
[suninfo] => Array
(
[sunrise] => 06:32:37
[sunset] => 18:08:50
[transit] => 12:20:43
[civil_twilight_begin] => 06:02:02
[civil_twilight_end] => 18:39:25
[nautical_twilight_begin] => 05:26:18
[nautical_twilight_end] => 19:15:08
[astronomical_twilight_begin] => 04:50:00
[astronomical_twilight_end] => 19:51:27
)
[raw] => Array
(
[sunrise] => 1362839557
[sunset] => 1362881330
[transit] => 1362860443
[civil_twilight_begin] => 1362837722
[civil_twilight_end] => 1362883165
[nautical_twilight_begin] => 1362835578
[nautical_twilight_end] => 1362885308
[astronomical_twilight_begin] => 1362833400
[astronomical_twilight_end] => 1362887487
)
[dayLength] => 11:36
)
但是,每个后续页面加载都会得到以下结果:
Array
(
[suninfo] => Array
(
[sunrise] => 16:00:01
[sunset] => 16:00:01
[transit] => 12:20:43
[civil_twilight_begin] => 06:02:02
[civil_twilight_end] => 18:39:25
[nautical_twilight_begin] => 05:26:18
[nautical_twilight_end] => 19:15:08
[astronomical_twilight_begin] => 04:50:00
[astronomical_twilight_end] => 19:51:27
)
[raw] => Array
(
[sunrise] => 1
[sunset] => 1
[transit] => 1362860443
[civil_twilight_begin] => 1362837722
[civil_twilight_end] => 1362883165
[nautical_twilight_begin] => 1362835578
[nautical_twilight_end] => 1362885308
[astronomical_twilight_begin] => 1362833400
[astronomical_twilight_end] => 1362887487
)
[dayLength] => 0:0
)
这很有趣,因为在评论date_diff
时,date_sun_info
每次都能正常运行,真正有趣的部分是它只会在第一页加载后更改date_sun_info
的输出。如您所见,sunrise
和sunset
之后被设置为1
。 (这也意味着我计算的dayLength
始终为0
。)正如您在代码中看到的那样,我已尝试使用date_sunrise
和{{3}在我的问题排查过程中,但在date_diff
之后,这些内容也会在后续页面加载时返回1
。
我尝试过的其他事情:在自己的函数内和自己的命名空间中对dayLength
计算进行分区。清除缓存,不同的浏览器等
我确实意识到还有其他方法可以在不使用此函数的情况下计算dayLength
,并实现了这些方法,以便API按预期工作。我的问题是,为什么date_sun_info
在使用date_diff
时首次加载页面后会产生不同的结果?我已经搜索过PHP的bug并且无法找到任何内容,也无法在其他任何地方找到任何可能导致此错误的内容。我希望有人可以告诉我这个原因。它被复制到两台机器上,包括PHP 5.3.x和Apache 2.2,一台是Windows 7,另一台是Ubuntu。