I use an IP to location database to determine the visitor's approximate latitude and longitude and then serve them a day or night color scheme based on whether it is before civil dawn or dusk. I've had problems when not specifying the timezone, specifically a 1 hour error, so I use GMT.
<?
date_default_timezone_set("GMT");
function scheme() {
$sunrise = date_sunrise(time(), SUNFUNCS_RET_DOUBLE, $latitude, $longitude, 96, 0);
$sunset = date_sunset(time(), SUNFUNCS_RET_DOUBLE, $latitude, $longitude, 96, 0);
$now = date("H") + date("i") / 60 + date("s") / 3600;
if ($sunrise < $sunset)
if (($now > $sunrise) && ($now < $sunset)) return "day";
else return "night";
else
if (($now > $sunrise) || ($now < $sunset)) return "day";
else return "night";
}
?>
date_sunset
(PHP 5)
date_sunset — Obtiene la hora del atardecer de un día y lugar concretos
Descripción
date_sunset() devuelve la hora del atardecer de un día (indicado en marca_de_tiempo ) y lugar concretos. Los par´metros latitud , longitud y cenit tienen unos valores por defecto iguales a las opciones de configuración date.default_latitude, date.default_longitude y date.sunrise_zenith respectivamente.
El valor de latitud se interpreta por defecto respecto del Norte. Si se quiere especificar un valor respecto del Sur, se debe pasar un valor negativo. Igualmente, longitude se interpreta por defecto referido al Este (y se debe emplear un valor negativo para referenciarlo respecto del Oeste).
El parámetro diferencia_gmt se indica en horas.
| Constante | Descripciónn | Ejemplo |
|---|---|---|
| SUNFUNCS_RET_STRING | Devuelve la hora del atardecer como una variable de tipo string | 16:46 |
| SUNFUNCS_RET_DOUBLE | Devuelve el resultado como una variable de tipo float | 16.78243132 |
| SUNFUNCS_RET_TIMESTAMP | Devuelve el resultado como una variable de tipo integer (es decir, una marca de tiempo) | 1095034606 |
Example #1 Ejemplo de date_sunset()
<?php
/* Calcula la hora del atardecer de Lisboa, Portugal
Latitud: 38.4 Norte
Longitud: 9 Oeste
Cenit ~= 90
Diferencia horaria: +1 GMT
*/
echo date("D M d Y"). ', hora del atardecer : ' .date_sunset(time(), SUNFUNCS_RET_STRING, 38.4, -9, 90, 1);
?>
El resultado del ejemplo seria algo similar a:
Mon Dec 20 2004, hora del amanecer : 18:13
Vea también date_sunrise().
date_sunset
30-Sep-2006 02:17
20-Feb-2005 07:19
Here a function that will return an array of all valid formats, both starting and ending times!
[Editor's note: you can find that function on the docpage of date_sunrise()]
02-Dec-2004 10:39
A way to use this:
<?php
// De Bilt, The Netherlands, weather station #06260
$lat = 52.10; // North
$long = 5.18; // East
$offset = 1; // 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);
$zenith=96;
echo "<br><p>\"Civilian Twilight\" start: ".date_sunrise(time(), SUNFUNCS_RET_STRING, $lat, $long, $zenith, $offset);
echo "<br>\"Civilian Twilight\" end: ".date_sunset(time(), SUNFUNCS_RET_STRING, $lat, $long, $zenith, $offset);
$zenith=102;
echo "<br><p>\"Nautical Twilight\" start: ".date_sunrise(time(), SUNFUNCS_RET_STRING, $lat, $long, $zenith, $offset);
echo "<br>\"Nautical Twilight\" end: ".date_sunset(time(), SUNFUNCS_RET_STRING, $lat, $long, $zenith, $offset);
$zenith=108;
echo "<br><p>\"Astronomical Twilight\" start: ".date_sunrise(time(), SUNFUNCS_RET_STRING, $lat, $long, $zenith, $offset);
echo "<br>\"Astronomical Twilight\" end: ".date_sunset(time(), SUNFUNCS_RET_STRING, $lat, $long, $zenith, $offset);
?>
Thanks to George King.
More sources about this topic:
http://www.qarlos.free.fr/navegacion/Sextante/formulas.htm
http://williams.best.vwh.net/sunrise_sunset_algorithm.htm
http://www.kevinboone.com/suntimes.html
http://star-www.st-and.ac.uk/~fv/webnotes/chapt12.htm
