1

我正在尝试构建一个函数,该函数将返回查塔姆群岛的日出和日落时间(通常为 UTC+12:45,夏季为 +13:45)

我有以下代码适用于新西兰,但在输入设置为 Chatham 时返回第二天的时间。

<?php
$timeInUTC = "2013-08-15T00:00:01Z";
$this_tz = new \DateTimeZone("Pacific/Chatham");  
$lat = -44;
$long = -176.5;   

$startTimestamp = strtotime($timeInUTC);            
$startTime = new \DateTime($timeInUTC,$this_tz);
$offset = ($this_tz->getOffset($startTime))/3600;                   

$sunriseTimestamp = date_sunrise($startTimestamp, SUNFUNCS_RET_TIMESTAMP, $lat, $long, 90, $offset);
$sunsetTimestamp = date_sunset($startTimestamp, SUNFUNCS_RET_TIMESTAMP, $lat, $long, 90, $offset);


$startTimeString = date("c",$startTimestamp);
$sunriseTimeString = date("c",$sunriseTimestamp);
$sunsetTimeString = date("c",$sunsetTimestamp);

echo "At ($lat,$long) on the day of $startTimeString the sun rises at $sunriseTimeString and sets at $sunsetTimeString (offset of $offset)\n";


?>

这返回

At (-44,-176.5) on the day of 2013-08-15T12:00:01+12:00 the sun rises at 2013-08-16T06:43:28+12:00 and sets at 2013-08-16T16:57:13+12:00 (offset of 12.75)

正如您从打印输出中看到的,它认为日出是在指定时间之后 18.75 小时,日落是在输入时间之后 27 小时,除非它在北极圈内并且太阳下山超过 24 小时,否则这是不可能的小时。

那么,我是在错误地使用 date_sunrise,还是 PHP 遇到了我必须解决的错误?

另外 我尝试调整经度,发现 -178.9140 给出了日出的正确日期(我必须假设时间是正确的)但 -178.9130 向前跳了 24 小时。所有其他输入都相同

更新 随着夏令时的变化,这已经蔓延到新西兰的一半。

检查 2013 年 10 月 1 日 10:35(新西兰夏令时间)在经度 177.25 的日出时间得到 2013-10-01T06:45:18+13:00 但在日出时将经度转移到 177.5 报告为 2013-10- 02T06:44:18+13:00

我已将此添加到 php.net ( https://bugs.php.net/bug.php?id=53148 ) 的错误报告中,并找到了解决方法,详情如下

4

1 回答 1

0

它似乎是 PHP 中的一个错误,我必须找到一种解决方法。

$startDayOfYear = date("z",$startTimestamp);
$sunriseDayOfYear = date("z",$sunriseTimestamp);

if($startDayOfYear != $sunriseDayOfYear)
{
    $sunriseTimeString = date("c",$sunriseTimestamp." - 1 day");
    $sunsetTimeString = date("c",$sunsetTimestamp." - 1 day");
} else {
    $sunriseTimeString = date("c",$sunriseTimestamp);
    $sunsetTimeString = date("c",$sunsetTimestamp);
}
于 2013-10-28T23:02:29.943 回答