Version: 1.0
Type: Function
Category: Calendars/Dates
License: GNU General Public License
Description: This function gives you the time for sunrise or sunset for a particular day at a particular location.
/*****************************************************
*This is an implementation of the Sunrise/Sunset Algorithm
*found at
* http://williams.best.vwh.net/sunrise_sunset_algorithm.htm
*from the Almanac for Computers, 1990
*Published by Nautical Almanac Office
*Washington, DC 20392
*Implemented by Chris Snyder
*****************************************************/
/*****************************************************
*Function name:calcSunset
*Params: $date(The day to calculate sunset or sunrise for)
* $lat(The latitude for the location to calculate sunrise or sunset for)
* $lon(The longitude for the location to calculate sunrise or sunset for west is negative)
* $sunset(if set to 1 calculates sunset if set to 0 sunrise)
* $GMToffset(difference in hours from GMT)
*****************************************************/
function calcSunset($date, $lat=41.57, $lon=-86.2, $sunset=1, $GMToffset=-4)
{
//The sun's Zenith
$zenith = 90.83;
//The sun's Zenith to calculate civil twilight
//$zenith=96;
//need the day of year
$day = getdate($date);
$N = $day['yday']+1;
//Convert the longitude to hour value and calculate and
//Approximate time.
$lonHour = ($lon/15);
if($sunset)
$t=$N+((18-$lonHour)/24);
else
$t=$N+((6-$lonHour)/24);
//Calculate the Sun's mean anomaly
$M = (0.9856*$t)-3.289;
//Calculate the Sun's true longitude
$sinM = sin(deg2rad($M));
$sin2M = sin(2*deg2rad($M));
$L=$M +(1.916*$sinM) + (0.02*$sin2M) + 282.634;
if($L>360)
$L-=360;
if($L<0)
$L+=360;
//Calculate the Sun's right ascension(RA)
$tanL = 0.91764 * tan(deg2rad($L));
$RA = rad2deg(atan($tanL));
if($RA>360)
$RA-=360;
if($RA<0)
$RA+=360;
//Putting the RA value into the same quadrant as L
$LQ = (floor($L/90))*90;
$RAQ = (floor($RA/90))*90;
$RA = $RA + ($LQ - $RAQ);
//Convert RA values to hours
$RA /= 15;
//calculate the Sun's declination
$sinDec = 0.39782 * sin(deg2rad($L));
$cosDec = cos(asin($sinDec));
//calculate the Sun's local hour angle
//if cosH > 1 the sun never rises on this date at this location
//if cosH < -1 the sun never sets on this date at this location
$cosH = (cos(deg2rad($zenith)) - ($sinDec * sin(deg2rad($lat)))) / ($cosDec * cos(deg2rad($lat)));
//finish calculating H and convert into hours
if($sunset)
$H = rad2deg(acos($cosH));
else
$H = 360 - rad2deg(acos($cosH));
$H /= 15;
//Calculate local mean time of rising/setting
$T = $H + $RA - (0.06571 * $t) - 6.622;
//Adjust back to UTC
$UT = $T - $lonHour;
if($UT>24)
$UT -= 24;
if($UT<0)
$UT += 24;
//Adjust for current time zone
$UT=$UT+$GMToffset;
if($UT<0)
$UT+=24;
//format to readable form
$hour = floor($UT);
$minutes = round(60*($UT - $hour));
$minutes = str_pad($minutes, 3, ":0", STR_PAD_LEFT);
$UT = $hour.$minutes;
return $UT;
}