#49676 [Opn]: date_sunrise() off by several minutes

From: Date: Fri, 25 Sep 2009 23:12:10 +0000
Subject: #49676 [Opn]: date_sunrise() off by several minutes
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-142911@lists.php.net to get a copy of this message
 ID:               49676
 Updated by:       rasmus@php.net
 Reported By:      eclipsechasers2 at yahoo dot com
 Status:           Open
 Bug Type:         Date/time related
 Operating System: *
 PHP Version:      5.2.11, 5.3.1RC1 , 6
 New Comment:

> I believe that calc_sunset?0:1 in that expression should be 1 all
the
> time in order to give correct results for both sunrise and sunset.

That statement doesn't make much sense.  calc_sunset?0:1 means that it
is always 0 when calculating the sunset and always 1 when calculating
the sunrise, so I don't think that is it.

By the way, your example seems overly complex.  

$db = new DateTime('2009-03-01');
$de = new DateTime('2009-03-14');
$di = DateInterval::createFromDateString('next day');
$dp = new DatePeriod($db, $di, $de);
foreach($dp as $dt) {
   echo $dt->format("M d
").date_sunrise($dt->format("U"),SUNFUNCS_RET_STRING,37.787,-122.447)."\n";
}



Previous Comments:
------------------------------------------------------------------------

[2009-09-25 21:52:20] eclipsechasers2 at yahoo dot com

Description:
------------
Although sunset time agrees with many websites, sunrise time is off by
several minutes, e.g.:
http://www.timeanddate.com/worldclock/astronomy.html?n=224&month=3&year=2009&obj=sun&afl=-11&day=1
or http://www.sunrisesunset.com/custom_srss_calendar.asp

This is a follow-on problem from bug 49558.
PHP internal code in php_date.c was changed to:
rs = timelib_astro_rise_set_altitude(t, longitude, latitude, altitude,
calc_sunset?0:1, &h_rise, &h_set, &rise, &set, &transit)

I believe that calc_sunset?0:1 in that expression should be 1 all the
time in order to give correct results for both sunrise and sunset.

Reproduce code:
---------------
<?php
$gregyear = 2009; $gregmonth = 3; $gregday = 1;
$location = "San Francisco"; $latitude = 37.787; $longitude =
-122.447;
$timezone = "America/Los_Angeles";
date_default_timezone_set($timezone);
$gregmonthname =
JDMonthName(cal_to_jd(CAL_GREGORIAN,$gregmonth,1,2000),1);
$jd = gregoriantojd($gregmonth, $gregday, $gregyear);
  $weekday = jddayofweek($jd,0);
  echo "<b>$gregyear $gregmonthname $dd  - " . jddayofweek($jd,1) . " -
";
  echo "Latitude $latitude Longitude $longitude Time Zone $timezone
Location $location</b>\n";
  for ($i = 0; $i <= 30; $i++) {
    list($m11,$d11,$y11) = split('/',jdtogregorian($jd + $i));
    if ($m11 < 10) $m11 = "0" . $m11;
    if ($d11 < 10) $d11 = "0" . $d11;
    $ts = $y11 . "-" . $m11 . "-" . $d11 . " 06:00:00";
    $strts = strtotime($ts);
    $dateobj = new DateTime($ts);
    $gmto = $dateobj->getOffset() / 3600;
    $sunris0 = date_sunrise($strts,SUNFUNCS_RET_TIMESTAMP, $latitude,
$longitude, 90 + 50/60, $gmto);
    $sunset0 = date_sunset ($strts,SUNFUNCS_RET_TIMESTAMP, $latitude,
$longitude, 90 + 50/60, $gmto);
    printf("<br>%s %s %s\n",$ts,date("g:i:sa",$sunris0),
date("g:i:sa",$sunset0));
    }
?> 

Expected result:
----------------
Last two columns (sunrise and sunset) should generally agree with
websites above, e.g.:
Mar 1, 2009	6:41 AM	6:04 PM
Mar 2, 2009	6:39 AM	6:05 PM
Mar 3, 2009	6:38 AM	6:06 PM
Mar 4, 2009	6:37 AM	6:07 PM
Mar 5, 2009	6:35 AM	6:08 PM
Mar 6, 2009	6:34 AM	6:09 PM
Mar 7, 2009	6:32 AM	6:10 PM
Mar 8, 2009	7:31 AM	7:11 PM
Mar 9, 2009	7:29 AM	7:12 PM
Mar 10, 2009	7:28 AM	7:13 PM
Mar 11, 2009	7:26 AM	7:13 PM
Mar 12, 2009	7:25 AM	7:14 PM
Mar 13, 2009	7:23 AM	7:15 PM
Mar 14, 2009	7:22 AM	7:16 PM

Actual result:
--------------
<br>2009-03-01 06:00:00 6:37:59am 6:04:20pm Note excellent agreement
<br>2009-03-02 06:00:00 6:36:35am 6:05:20pm for sunset times,
<br>2009-03-03 06:00:00 6:35:09am 6:06:19pm but relatively large
<br>2009-03-04 06:00:00 6:33:43am 6:07:18pm difference for sunrise.
<br>2009-03-05 06:00:00 6:32:16am 6:08:17pm
<br>2009-03-06 06:00:00 6:30:49am 6:09:16pm
<br>2009-03-07 06:00:00 6:29:21am 6:10:14pm
<br>2009-03-08 06:00:00 7:27:57am 7:11:10pm
<br>2009-03-09 06:00:00 7:26:28am 7:12:08pm
<br>2009-03-10 06:00:00 7:24:59am 7:13:05pm
<br>2009-03-11 06:00:00 7:23:30am 7:14:03pm
<br>2009-03-12 06:00:00 7:22:00am 7:15:00pm
<br>2009-03-13 06:00:00 7:20:30am 7:15:57pm
<br>2009-03-14 06:00:00 7:19:00am 7:16:53pm


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=49676&edit=1



Thread (4 messages)

« previous php.bugs (#142911) next »