2011-05-27 42 views
3

有两件事情我不理解this function功能date_sunrise()返回错误的时间,并可能导致

格式SUNFUNCS_RET_TIMESTAMP使用时1.Offset不被考虑。例如,如果我使用的格式SUNFUNCS_RET_STRING,并使用此代码:

$lat = 46.055556; // Latitude (Ljubljana). 
$long = 14.508333; // Longitude (Ljubljana). 
$offset = 2; // Difference between GMT and local time in hours. 
$zenith = 90 + 50/60; 

echo "<br><p>Sunrise: " . date_sunrise(time(), SUNFUNCS_RET_STRING, $lat, $long, $zenith, $offset); 
echo "<br>Sunset: " . date_sunset(time(), SUNFUNCS_RET_STRING, $lat, $long, $zenith, $offset); 

然后,它会显示在某种程度上正确answear(由我的意思不知何故将在第二点说明):

日出:05 :15 日落:20:42

现在,如果我用SUNFUNCS_RET_TIMESTAMP并将其与功能日期()转换为日期的字符串表示:

$lat = 46.055556; // Latitude (Ljubljana). 
$long = 14.508333; // Longitude (Ljubljana). 
$offset = 2; // Difference between GMT and local time in hours. 
$zenith = 90 + 50/60; 

$dateSunRise = date_sunrise(time(), SUNFUNCS_RET_TIMESTAMP, $lat, $long, $zenith, $offset); 
$dateSunSet = date_sunset(time(), SUNFUNCS_RET_TIMESTAMP, $lat, $long, $zenith, $offset); 

echo "<br><p>Sunrise: " . date("H:i", $dateSunRise); 
echo "<br><p>Sunrise: " . date("H:i", $dateSunSet); 

我得到这样的结果:

日出:03:15 日出:18:42

我检查了时间戳,它肯定返回错误的,这就是为什么我不明白,因为我使用了前面示例中定义的相同的偏移量,其中我使用了SUNFUNCS_RET_STRING。

2.我写的第一点是,它显示了某种正确的答案,这里是我的意思的解释。我们的官方气象机构ARSO每天在他们的页面上更新关于日出和日落的信息。该页面可在this link上找到(对不起,因为它不是英文版)。底线是,我们的首都(卢布尔雅那),它有这样的信息:

日出:5:18 日出:20:41

哪里有date_sunrise和date_sunset功能此得到:

日出:5时15 日落时间:20点42个

参数a与第一点(纬度,经度,偏移量,天顶)相同。现在经纬度肯定是正确的(checked with GeoHack for Ljubljana)。我开始认为这种差异来自天顶参数。但我已经在互联网上搜索和它说的:

天顶为最佳的整体数字是90+(50/60)度真正的日出/日落

我无言以对为什么说到对此不同,这两个函数可能返回错误的结果吗?

回答

6

当您使用时间戳时,它们几乎总是UNIX时间戳,这意味着它们以UTC给出。与他们一起工作时,您必须在计算结束时将它们转换为您自己的时区。出于您的目的,您可能只需要SUNFUNCS_RET_STRING。

对于第二点,天顶在计算日出和日落的确切分钟中扮演着重要角色。 90+(50/60)只是一个球场估计。有在线计算器可以给你更好的数字用于你的坐标,并且它们对日出和日落都会有所不同。

下面的代码会给你你正在寻找卢布尔雅那的数字:

$lat = 46.055556; // Latitude (Ljubljana). 
$long = 14.508333; // Longitude (Ljubljana). 
$offset = 2; // Difference between GMT and local time in hours. 

$rise_zenith = 90+(25/60); 
$set_zenith = 90+(40/60); 

echo "<br>Sunrise: " . date_sunrise(time(), SUNFUNCS_RET_STRING, $lat, $long, $rise_zenith, $offset); 
echo "<br>Sunset: " . date_sunset(time(), SUNFUNCS_RET_STRING, $lat, $long, $set_zenith, $offset); 
+0

感谢answear!现在关于时间戳,我需要SUNFUNCS_RET_TIMESTAMP,因为我在flot图中使用了这些数据,这意味着日期参数需要在UNIX时间戳乘以1000(它使用毫秒)。 SUNFUNCS_RET_STRING只返回带有小时和分钟的字符串。但没关系,我用这段代码解决了这个问题:$ dateSunRise =(date_sunrise(time(),SUNFUNCS_RET_TIMESTAMP,$ lat,$ long,$ zenith,$ offset)+ 2 * 60 * 60)* 1000;感谢rise_zenith和set_zenith公式。 – 2011-05-27 14:02:45

+0

我想知道,如果这个公式全年有效,还是根据地球相对于太阳的位置而改变? – 2011-05-27 14:03:18

+0

我不是那个专业的专家。由于这些数字是在日出和日落时使用的,我相信这是你的视野所在的角度。如果你的视野在所有方向上都比较平坦,你就不需要改变它。否则,您可能需要在一年中的其他时间验证它们。 – Dan 2011-05-27 14:18:03