TigerZF
🌐Español

26.7. Ejemplos prácticos

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.

26.7.1. Comprobación de fechas

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";
}

26.7.2. Amanecer y atardecer

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);
}

26.7.3. Zonas horarias

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();