En este capítulo describiremos varias funciones adicionales que también están disponibles
a través de Zend_Date. Por supuesto, todas las funciones descritas tienen ejemplos
adicionales para mostrar el funcionamiento esperado y la sencilla API para el uso
adecuado de las mismas.
Probablemente la mayoría de las fechas que reciba como entrada serán cadenas de texto. Pero el problema
con las cadenas de texto es que no se puede estar seguro de si la cadena es una fecha real. Por ello
Zend_Date ha dedicado una función estática propia para comprobar cadenas de fecha.
Zend_Locale tiene una función propia
getDate($date, $locale) que analiza una fecha y devuelve las
partes de fecha adecuadas y normalizadas. El nombre de un mes, por ejemplo, será reconocido y
devuelto simplemente como un número de mes. Pero como Zend_Locale no conoce
nada sobre fechas porque es una clase de normalización y localización, hemos
integrado una función propia isDate($date) que comprueba esto.
isDate($date, $format, $locale) puede tomar hasta 3 parámetros
y necesita como mínimo uno. Así que lo que necesitamos para verificar una fecha es, por supuesto, la
fecha misma como cadena de texto. El segundo parámetro puede ser el formato que se espera que tenga la
fecha. Si no se proporciona ningún formato, se utiliza el formato de fecha estándar de su configuración regional. Para
más detalles sobre cómo deben verse los formatos, consulte el capítulo sobre formatos autodefinidos.
El tercer parámetro es también opcional, como el segundo parámetro, y puede usarse para proporcionar una configuración regional. Necesitamos la configuración regional para normalizar los nombres de meses y días. Así, con el tercer parámetro somos capaces de reconocer fechas como '01.Jänner.2000' o '01.January.2000' dependiendo de la configuración regional proporcionada.
isDate() por supuesto comprueba si una fecha existe.
Zend_Date en sí mismo no comprueba una fecha. Así que es posible
crear una fecha como '31.February.2000' con
Zend_Date porque Zend_Date
corregirá automáticamente la fecha y devolverá la fecha adecuada. En nuestro caso
'03.March.2000'. isDate() por otro
lado hace esta comprobación y devolverá FALSE en
'31.February.2000' porque sabe que esta fecha es imposible.
Ejemplo 26.17. Comprobación de fechas
// Checking dates
$date = '01.03.2000';
if (Zend_Date::isDate($date)) {
print "String $date is a date";
} else {
print "String $date is NO date";
}
// Checking localized dates
$date = '01 February 2000';
if (Zend_Date::isDate($date,'dd MMMM yyyy', 'en')) {
print "String $date is a date";
} else {
print "String $date is NO date";
}
// Checking impossible dates
$date = '30 February 2000';
if (Zend_Date::isDate($date,'dd MMMM yyyy', 'en')) {
print "String $date is a date";
} else {
print "String $date is NO date";
}
Zend_Date también tiene funciones integradas para obtener información
sobre el sol. A menudo es necesario obtener la hora del amanecer o del atardecer en un
día concreto. Esto es bastante sencillo con Zend_Date, ya que simplemente
hay que indicar el día esperado y, además, la ubicación para la que se debe calcular el
amanecer o el atardecer.
Como la mayoría de las personas no conocen la ubicación de su ciudad, también hemos dedicado una clase auxiliar que proporciona los datos de ubicación de unas 250 ciudades capitales y otras grandes ciudades de todo el mundo. La mayoría de las personas podrían utilizar ciudades cercanas a ellas mismas, ya que la diferencia entre ubicaciones situadas cerca unas de otras solo puede medirse en algunos segundos.
Para crear un cuadro de lista y elegir una ciudad concreta, puede utilizarse la función
Zend_Date_Cities::getCityList(). Devuelve los
nombres de todas las ciudades predefinidas disponibles para la clase auxiliar.
Ejemplo 26.18. Obtención de todas las ciudades disponibles
// Output the complete list of available cities print_r (Zend_Date_Cities::getCityList());
La ubicación en sí puede obtenerse con la función
Zend_Date_Cities::city(). Acepta el nombre de la
ciudad tal como lo devuelve la función Zend_Date_Cities::getCityList()
y, opcionalmente, como segundo parámetro, el horizonte a establecer.
Hay 4 horizontes definidos que pueden usarse con las ubicaciones para obtener la hora exacta
del atardecer y el amanecer. El parámetro '$horizon' siempre es opcional en
todas las funciones. Si no se establece, se utiliza el horizonte 'effective'.
Tabla 26.18. Tipos de horizontes admitidos para el atardecer y el amanecer
| Horizonte | Descripción | Uso |
|---|---|---|
| effective | Horizonte estándar | Espera que el mundo sea una esfera. Este horizonte se utiliza siempre si no se define ninguno. |
| civil | Horizonte común | Utilizado a menudo en medios comunes como la TV o la radio |
| nautic | Horizonte náutico | Utilizado a menudo en navegación marítima |
| astronomic | Horizonte astronómico | Utilizado a menudo para cálculos con estrellas |
Por supuesto, también se puede proporcionar y calcular una ubicación autodefinida. Para ello hay que dar una 'latitude' y una 'longitude' y, opcionalmente, el 'horizon'.
Ejemplo 26.19. Obtención de la ubicación de una ciudad
// Get the location for a defined city
// uses the effective horizon as no horizon is defined
print_r (Zend_Date_Cities::city('Vienna'));
// use the nautic horizon
print_r (Zend_Date_Cities::city('Vienna', 'nautic'));
// self definition of a location
$mylocation = array('latitude' => 41.5, 'longitude' => 13.2446);
Como ya se pueden establecer todos los datos necesarios, lo siguiente es crear un
objeto Zend_Date con el día en el que se debe calcular el atardecer o el amanecer.
Para el cálculo hay disponibles 3 funciones. Es posible
calcular el atardecer con 'getSunset()', el amanecer con
'getSunrise()' y toda la información disponible relacionada con el
sol con 'getSunInfo()'. Después del cálculo, se devolverá el
objeto Zend_Date con la hora calculada.
Ejemplo 26.20. Cálculo de información solar
// Get the location for a defined city
$city = Zend_Date_Cities::city('Vienna');
// create a date object for the day for which the sun has to be calculated
$date = new Zend_Date('10.03.2007', Zend_Date::ISO_8601, 'de');
// calculate sunset
$sunset = $date->getSunset($city);
print $sunset->get(Zend_Date::ISO_8601);
// calculate all sun informations
$info = $date->getSunInfo($city);
foreach ($info as $sun) {
print "\n" . $sun->get(Zend_Date::ISO_8601);
}
Las zonas horarias son tan importantes como las propias fechas. Hay varias zonas horarias dependiendo
de dónde en el mundo viva un usuario. Así que trabajar con fechas también significa establecer la
zona horaria adecuada. Esto puede sonar complicado, pero es más fácil de lo esperado. Como ya se mencionó
en el primer capítulo de Zend_Date, hay que establecer la zona horaria por defecto.
Ya sea mediante php.ini o mediante una definición en el archivo de arranque.
Un objeto Zend_Date por supuesto también almacena la zona horaria actual.
Incluso si la zona horaria se cambia después de la creación del objeto, recuerda la
zona horaria original y trabaja con ella. Tampoco es necesario cambiar la zona horaria
dentro del código con funciones de PHP. Zend_Date
tiene dos funciones integradas que hacen posible gestionar esto.
getTimezone() devuelve la zona horaria actual establecida dentro del
objeto Zend_Date. Recuerde que Zend_Date
no está acoplado con los internos de PHP. Así que la zona horaria devuelta no es
la zona horaria del script PHP, sino la zona horaria del objeto.
setTimezone($zone) es la segunda función y hace posible
establecer una nueva zona horaria para Zend_Date. Una zona horaria dada siempre se
comprueba. Si no existe, se lanzará una excepción. Además, la zona horaria actual del
script o del sistema se puede establecer en el objeto de fecha llamando a
setTimezone() sin el parámetro de zona. Esto también se hace
automáticamente cuando se crea el objeto de fecha.
Ejemplo 26.21. Trabajando con zonas horarias
// Set a default timezone... this has to be done within the bootstrap
// file or php.ini.
// We do this here just for having a complete example.
date_default_timezone_set('Europe/Vienna');
// create a date object
$date = new Zend_Date('10.03.2007', Zend_Date::DATES, 'de');
// view our date object
print $date->getIso();
// what timezone do we have ?
print $date->getTimezone();
// set another timezone
$date->setTimezone('America/Chicago');
// what timezone do we now have ?
print $date->getTimezone();
// see the changed date object
print $date->getIso();
Zend_Date siempre toma la zona horaria actual para la creación del objeto, como
se muestra en las primeras líneas del ejemplo. Cambiar la zona horaria dentro del objeto creado
también tiene un efecto sobre la fecha en sí. Las fechas siempre están relacionadas con una zona horaria. Cambiar
la zona horaria de un objeto Zend_Date no cambia la hora de
Zend_Date. Recuerde que internamente las fechas siempre se almacenan como
marcas de tiempo y en GMT. Así que la zona horaria significa cuántas horas se deben
restar o sumar para obtener la hora global actual para la propia zona horaria y región.
Tener la zona horaria acoplada dentro de Zend_Date tiene otro efecto
positivo. Es posible tener varias fechas con distintas zonas horarias.
Ejemplo 26.22. Múltiples zonas horarias
// Set a default timezone... this has to be done within the bootstrap
// file or php.ini.
// We do this here just for having a complete example.
date_default_timezone_set('Europe/Vienna');
// create a date object
$date = new Zend_Date('10.03.2007 00:00:00', Zend_Date::ISO_8601, 'de');
// view our date object
print $date->getIso();
// the date stays unchanged even after changeing the timezone
date_default_timezone_set('America/Chicago');
print $date->getIso();
$otherdate = clone $date;
$otherdate->setTimezone('Brazil/Acre');
// view our date object
print $otherdate->getIso();
// set the object to the actual systems timezone
$lastdate = clone $date;
$lastdate->setTimezone();
// view our date object
print $lastdate->getIso();