ID: 49676 Updated by: ras...@php.net Reported By: eclipsechasers2 at yahoo dot com -Status: Open +Status: Closed Bug Type: Date/time related Operating System: * PHP Version: 5.2.11, 5.3.1RC1 , 6 New Comment:
Ah, I see. I think I confused twilight with sunset reading those comments before. Previous Comments: ------------------------------------------------------------------------ [2009-09-26 00:38:01] eclipsechasers2 at yahoo dot com Thank you for the improved example. I have not done much php coding, and am glad to have the tips. I do not understand from your comment if it is my suggestion that "doesn't make sense", or the existing code. Assuming that you meant the former, let me explain further. The code for timelib_astro_rise_set_altitude is found in astro.c. For the parameter in question, the comments explain: * upper_limb: non-zero -> upper limb, zero -> center * Set to non-zero (e.g. 1) when computing rise/set * times, and to zero when computing start/end of * twilight. This suggests, at least to me, that the value should be 1 when computing both sunrise and sunset. However, as coded, it is 1 at sunset (which seems to return the correct time), but 0 for sunrise (which seems not to). I think if the value were always 1, it would always return the correct time (or at least a time consistent with other sites) for both. ------------------------------------------------------------------------ [2009-09-25 23:12:10] ras...@php.net > 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"; } ------------------------------------------------------------------------ [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