TigerZF
🌐Español

26.4. Resumen de la API de Zend_Date

Aunque la API de Zend_Date se mantiene sencilla y unitaria, su diseño sigue siendo flexible y potente gracias a las ricas permutaciones de operaciones y operandos.

26.4.1. Opciones de Zend_Date

26.4.1.1. Seleccionar el tipo de formato de fecha

Varios métodos usan cadenas de formato de fecha, de forma similar a la función date() de PHP. Si se siente más cómodo con el especificador de formato de fecha de PHP que con los especificadores de formato ISO, puede usar Zend_Date::setOptions(array('format_type' => 'php')). Después, use los especificadores de formato de fecha de PHP para todas las funciones que acepten un parámetro $format. Use Zend_Date::setOptions(array('format_type' => 'iso')) para volver al modo por defecto, que solo admite tokens de formato de fecha ISO. Para ver una lista de los códigos de formato admitidos, consulte Self-Defined OUTPUT Formats Using PHP's date() Format Specifiers

26.4.1.2. DST y aritmética de fechas

Cuando se manipulan fechas, a veces estas cruzan un cambio de DST (horario de verano), lo que normalmente hace que la fecha pierda o gane una hora. Por ejemplo, al sumar meses a una fecha anterior a un cambio de DST, si la fecha resultante es posterior al cambio de DST, dicha fecha parecerá perder o ganar una hora, lo que hace que cambie el valor de la hora de la fecha. Para fechas límite, como la medianoche del primer o último día de un mes, sumar suficientes meses como para cruzar un límite de fecha hace que la fecha pierda una hora y pase a ser la última hora del mes anterior, dando la apariencia de un error de "desfase de 1". Para evitar esta situación, el cambio de DST puede ignorarse usando la opción fix_dst. Al cruzar el límite de DST de verano o invierno, normalmente se resta o se suma una hora según la fecha. Por ejemplo, la aritmética de fechas que cruza el DST de primavera hace que una fecha tenga un valor de día uno menor de lo esperado, si la parte horaria de la fecha era originalmente 00:00:00. Dado que Zend_Date se basa en marcas de tiempo (timestamps), y no en fechas de calendario con un componente horario, la marca de tiempo pierde una hora, lo que hace que la fecha tenga un valor de día de calendario uno menor de lo esperado. Para evitar estos problemas use la opción fix_dst, cuyo valor por defecto es TRUE, lo que hace que el DST no tenga efecto en la "aritmética" de fechas (addMonth(), subMonth()). Use Zend_Date::setOptions(array('fix_dst' => false)) para habilitar la resta o suma del ajuste de DST al realizar aritmética de fechas.

Si la zona horaria real dentro de la instancia de Zend_Date está fijada a UTC o GMT, la opción 'fix_dst' no se utilizará porque estas dos zonas horarias no funcionan con el DST. Cuando cambie de nuevo la zona horaria de esta instancia a una zona horaria que no sea UTC ni GMT, se volverá a usar la opción 'fix_dst' establecida previamente para la aritmética de fechas.

26.4.1.3. Cálculo de meses

Al sumar o restar meses a una fecha existente, el valor resultante para el día del mes puede ser inesperado, si la fecha original caía en un día cercano al final del mes. Por ejemplo, al sumar un mes al 31 de enero, quienes están familiarizados con SQL esperarán el 28 de febrero como resultado. Por otro lado, quienes están familiarizados con Excel y OpenOffice esperarán el 3 de marzo como resultado. El problema solo ocurre si el mes resultante no tiene el día que está fijado en la fecha original. Para los desarrolladores de Zend Framework, el comportamiento deseado se puede seleccionar mediante la opción extend_month, para elegir entre el comportamiento de SQL, si se fija a FALSE, o el comportamiento de hoja de cálculo cuando se fija a TRUE. El comportamiento por defecto para extend_month es FALSE, lo que proporciona un comportamiento compatible con SQL. Por defecto, Zend_Date calcula los meses truncando las fechas al final del mes (si es necesario), sin pasar al mes siguiente cuando la fecha original designa un día del mes que excede el número de días del mes resultante. Use Zend_Date::setOptions(array('extend_month' => true)) para hacer que el cálculo de meses funcione como los populares programas de hoja de cálculo.

26.4.1.4. Acelerar la localización y normalización de fechas con Zend_Cache

Puede acelerar Zend_Date usando un adaptador de Zend_Cache. Esto acelera todos los métodos de Zend_Date cuando se usan datos localizados. Por ejemplo, todos los métodos que aceptan las constantes Zend_Date::DATE y Zend_Date::TIME se benefician de esto. Para asignar un adaptador de Zend_Cache a Zend_Date, simplemente use Zend_Date::setOptions(array('cache' => $adapter)).

26.4.1.5. Obtener marcas de tiempo sincronizadas con Zend_TimeSync

Normalmente, los relojes de los servidores y equipos difieren entre sí. Zend_Date es capaz de manejar estos problemas con la ayuda de Zend_TimeSync. Puede establecer un servidor de tiempo con Zend_Date::setOptions(array('timesync' => $timeserver)), lo que fijará el desfase entre la marca de tiempo real propia y la marca de tiempo real actual para todas las instancias de Zend_Date. Usar esta opción no cambia la marca de tiempo de las instancias existentes. Por lo tanto, el mejor uso es fijarla dentro del archivo de arranque (bootstrap).

26.4.2. Trabajar con valores de fecha

Una vez que la entrada se ha normalizado mediante la creación de un objeto Zend_Date, tendrá una zona horaria asociada, pero una representación interna que usa las marcas de tiempo UNIX estándar. Para que una fecha se muestre de forma localizada, primero se debe conocer una zona horaria. La zona horaria por defecto siempre es GMT o UTC. Para examinar la zona horaria de un objeto use getTimeZone(). Para cambiar la zona horaria de un objeto, use setTimeZone(). Se asume que todas las manipulaciones de estos objetos son relativas a esta zona horaria.

Tenga cuidado al mezclar operaciones con partes de fecha entre objetos de fecha para distintas zonas horarias, ya que generalmente producen resultados indeseables, a menos que las manipulaciones solo estén relacionadas con la marca de tiempo. Operar con objetos Zend_Date que tienen distintas zonas horarias generalmente funciona, salvo lo indicado anteriormente, ya que las fechas se normalizan a marcas de tiempo UNIX al instanciar Zend_Date.

La mayoría de los métodos esperan una constante que seleccione la $part deseada de una fecha, como Zend_Date::HOUR. Estas constantes son válidas para todas las funciones siguientes. Se proporciona una lista de todas las constantes disponibles en list of all constants. Si no se especifica ninguna $part, se asume Zend_Date::TIMESTAMP. Alternativamente, se puede usar un formato especificado por el usuario para $part, usando el mismo mecanismo subyacente y los mismos códigos de formato que Zend_Locale_Format::getDate(). Si un objeto de fecha se construye usando una fecha evidentemente inválida (por ejemplo, un número de mes mayor que 12), entonces Zend_Date lanzará una excepción, a menos que no se haya seleccionado un formato de fecha específico, es decir, $part es NULL o Zend_Date::DATES (un formato "laxo").

Ejemplo 26.8. Formato de fecha de entrada especificado por el usuario

$date1 = new Zend_Date('Feb 31, 2007', null, 'en_US');
echo $date1, "\n"; // outputs "Mar 3, 2007 12:00:00 AM"

$date2 = new Zend_Date('Feb 31, 2007', Zend_Date::DATES, 'en_US');
echo $date2, "\n"; // outputs "Mar 3, 2007 12:00:00 AM"

// strictly restricts interpretation to specified format
$date3 = new Zend_Date('Feb 31, 2007', 'MM.dd.yyyy');
echo $date3, "\n"; // outputs "Mar 3, 2007 12:00:00 AM"

Si se proporciona el parámetro opcional $locale, entonces $locale desambigua el operando $date reemplazando los nombres de meses y días de la semana para operandos $date de tipo cadena, e incluso analiza cadenas de fecha expresadas según las convenciones de esa configuración regional (vea Zend_Locale_Format::getDate()). La normalización automática de operandos $date localizados de tipo cadena ocurre cuando $part es una de las constantes Zend_Date::DATE* o Zend_Date::TIME*. La configuración regional identifica qué idioma debe usarse para analizar nombres de meses y nombres de días de la semana, si $date es una cadena que contiene una fecha. Si no hay ningún parámetro de entrada $date, entonces el parámetro $locale especifica la configuración regional que se usará para localizar la salida (por ejemplo, el formato de fecha para una representación de cadena). Tenga en cuenta que el parámetro de entrada $date podría en realidad tener un nombre de tipo distinto (por ejemplo, $hour para addHour()), aunque eso no impide el uso de objetos Zend_Date como argumentos para ese parámetro. Si no se especificó ninguna $locale, entonces se usa la configuración regional del objeto actual para interpretar $date, o para seleccionar el formato localizado para la salida.

Desde Zend Framework 1.7.0, Zend_Date también admite el uso de una configuración regional a nivel de aplicación. Puede simplemente asignar una instancia de Zend_Locale al registro como se muestra a continuación. Con esta notación puede olvidarse de establecer la configuración regional manualmente en cada instancia cuando quiera usar la misma configuración regional varias veces.

// in your bootstrap file
$locale = new Zend_Locale('de_AT');
Zend_Registry::set('Zend_Locale', $locale);

// somewhere in your application
$date = new Zend_Date('31.Feb.2007');

26.4.3. Operaciones básicas de Zend_Date comunes a muchas partes de fecha

Los métodos add(), sub(), compare(), get(), y set() operan de forma genérica sobre fechas. En cada caso, la operación se realiza sobre la fecha contenida en el objeto de la instancia. El operando $date es obligatorio para todos estos métodos, excepto get(), y puede ser una instancia de Zend_Date, una cadena numérica o un entero. Estos métodos asumen que $date es una marca de tiempo, si no es un objeto. Sin embargo, el operando $part controla sobre qué parte lógica de las dos fechas se opera, lo que permite operar sobre partes de la fecha del objeto, como el año o el minuto, incluso cuando $date contiene una cadena de fecha larga, como "December 31, 2007 23:59:59". El resultado de la operación cambia la fecha del objeto, excepto en el caso de compare() y get().

Ejemplo 26.9. Operar sobre partes de fechas

$date = new Zend_Date(); // $date's timestamp === time()

// changes $date by adding 12 hours
$date->add('12', Zend_Date::HOUR);
print $date;

Existen métodos de conveniencia para cada combinación de las operaciones básicas y varias partes de fecha comunes, como se muestra en las tablas siguientes. Estos métodos de conveniencia nos ayudan a los programadores perezosos a evitar tener que escribir las constantes de parte de fecha al usar los métodos generales anteriores. Convenientemente, se nombran combinando un prefijo (nombre de una operación básica) con un sufijo (tipo de parte de fecha), como addYear(). En la lista siguiente, existen todas las combinaciones de "Partes de fecha" y "Operaciones básicas". Por ejemplo, la operación "add" existe para cada una de estas partes de fecha, incluyendo addDay(), addYear(), etc.

Estos métodos de conveniencia tienen la misma funcionalidad equivalente que los métodos de operación básicos, pero esperan operandos $date de tipo cadena o entero que contengan solo los valores que representan el tipo indicado por el sufijo del método de conveniencia. Por tanto, los nombres de estos métodos (por ejemplo, "Year" o "Minute") identifican las unidades del operando $date, cuando $date es una cadena o un entero.

26.4.3.1. Lista de partes de fecha

Tabla 26.1. Partes de fecha

Parte de fecha Explicación
Timestamp Marca de tiempo UNIX, expresada en segundos transcurridos desde el 1 de enero de 1970 00:00:00 GMT.
Year Año del calendario gregoriano (por ejemplo, 2006)
Month Mes del calendario gregoriano (1-12, se admiten nombres localizados)
24 hour clock Las horas del día (0-23) denotan las horas transcurridas desde el inicio del día.
minute Los minutos de la hora (0-59) denotan los minutos transcurridos desde el inicio de la hora.
Second Los segundos del minuto (0-59) denotan los segundos transcurridos desde el inicio del minuto.
millisecond Los milisegundos denotan milésimas de segundo (0-999). Zend_Date admite dos métodos adicionales para trabajar con unidades de tiempo menores que segundos. Por defecto, las instancias de Zend_Date usan una precisión que por defecto es en milisegundos, como se ve al usar getFractionalPrecision(). Para cambiar la precisión use setFractionalPrecision($precision). Sin embargo, la precisión está limitada en la práctica a microsegundos, ya que Zend_Date usa microtime().
Day Zend_Date::DAY_SHORT se extrae de $date si el operando $date es una instancia de Zend_Date o una cadena numérica. En caso contrario, se intenta extraer el día según las convenciones documentadas para estas constantes: Zend_Date::WEEKDAY_NARROW, Zend_Date::WEEKDAY_NAME, Zend_Date::WEEKDAY_SHORT, Zend_Date::WEEKDAY (se asume calendario gregoriano)
Week Zend_Date::WEEK se extrae de $date si el operando $date es una instancia de Zend_Date o una cadena numérica. En caso contrario, se lanza una excepción. (Se asume calendario gregoriano)
Date Zend_Date::DAY_MEDIUM se extrae de $date si el operando $date es una instancia de Zend_Date. En caso contrario, se intenta normalizar la cadena $date en una fecha con el formato Zend_Date::DATE_MEDIUM. El formato de Zend_Date::DAY_MEDIUM depende de la configuración regional del objeto.
Weekday Los días de la semana se representan numéricamente como 0 (para el domingo) hasta 6 (para el sábado). Zend_Date::WEEKDAY_DIGIT se extrae de $date, si el operando $date es una instancia de Zend_Date o una cadena numérica. En caso contrario, se intenta extraer el día según las convenciones documentadas para estas constantes: Zend_Date::WEEKDAY_NARROW, Zend_Date::WEEKDAY_NAME, Zend_Date::WEEKDAY_SHORT, Zend_Date::WEEKDAY (se asume calendario gregoriano)
DayOfYear En Zend_Date, el día del año representa el número de días de calendario transcurridos desde el inicio del año (0-365). Al igual que con otras unidades anteriores, las fracciones se redondean hacia abajo al número entero más cercano. (Se asume calendario gregoriano)
Arpa Se admiten fechas Arpa (es decir, fechas con formato RFC 822). La salida usa el formato "GMT" o "Diferencial horario local horas+minutos" (vea la sección 5 del RFC 822). Antes de PHP 5.2.2, el uso de la constante DATE_RFC822 con las funciones de fecha de PHP a veces producía resultados incorrectos. Los resultados de Zend_Date son correctos. Ejemplo: Mon, 31 Dec 06 23:59:59 GMT
Iso Solo se admiten fechas ISO 8601 completas para la salida. Ejemplo: 2009-02-14T00:31:30+01:00

26.4.3.2. Lista de operaciones de fecha

Las operaciones básicas siguientes pueden usarse en lugar de las operaciones de conveniencia para partes de fecha específicas, si se usa la constante apropiada para el parámetro $part.

Tabla 26.2. Operaciones básicas

Operación básica Explicación
get()

get($part = null, $locale = null)

Use get($part) para obtener la $part de la fecha de este objeto, localizada según $locale, como cadena o entero con formato. Al usar la extensión BCMath, es posible que se devuelvan cadenas numéricas en lugar de enteros para valores grandes.

[Note] Comportamiento de get()

A diferencia de get(), los demás métodos de conveniencia get*() solo devuelven instancias de Zend_Date que contienen una fecha que representa la fecha u hora seleccionada o calculada.

set()

set($date, $part = null, $locale = null)

Asigna a la $part del objeto actual el valor correspondiente a esa parte encontrado en la entrada $date, que tiene una configuración regional $locale.

add()

add($date, $part = null, $locale = null)

Suma la $part de $date, con configuración regional $locale, a la fecha del objeto actual.

sub()

sub($date, $part = null, $locale = null)

Resta la $part de $date, con configuración regional $locale, de la fecha del objeto actual.

copyPart()

copyPart($part, $locale = null)

Devuelve un objeto clonado, con solo la $part de la fecha del objeto copiada al clon, y con la configuración regional del clon fijada arbitrariamente a $locale (si se especifica).

compare()

compare($date, $part = null, $locale = null)

compara la $part de $date con la marca de tiempo de este objeto, devolviendo 0 si son iguales, 1 si la parte de este objeto es más reciente que la parte de $date, y -1 en caso contrario.


26.4.4. Comparar fechas

Las siguientes operaciones básicas no tienen métodos de conveniencia correspondientes para las partes de fecha indicadas en Zend_Date API Overview.

Tabla 26.3. Métodos de comparación de fechas

Método Explicación
equals()

equals($date, $part = null, $locale = null)

devuelve TRUE, si la $part de $date, con configuración regional $locale, es igual a la $part de la fecha de este objeto, y FALSE en caso contrario

isEarlier()

isEarlier($date, $part = null, $locale = null)

devuelve TRUE, si la $part de la fecha de este objeto es anterior a la $part de $date, con configuración regional $locale

isLater()

isLater($date, $part = null, $locale = null)

devuelve TRUE, si la $part de la fecha de este objeto es posterior a la $part de $date, con configuración regional $locale

isToday()

isToday()

Comprueba si el año, mes y día de hoy coinciden con el valor de fecha de este objeto, usando la zona horaria de este objeto.

isTomorrow()

isTomorrow()

Comprueba si el año, mes y día de mañana coinciden con el valor de fecha de este objeto, usando la zona horaria de este objeto.

isYesterday()

isYesterday()

Comprueba si el año, mes y día de ayer coinciden con el valor de fecha de este objeto, usando la zona horaria de este objeto.

isLeapYear()

isLeapYear()

Use isLeapYear() para determinar si el objeto actual corresponde a un año bisiesto, o use Zend_Date::checkLeapYear($year) para comprobar $year, que puede ser una cadena, un entero, o una instancia de Zend_Date. ¿Es el año un año bisiesto?

isDate()

isDate($date, $format = null, $locale = null)

Este método comprueba si una fecha dada es una fecha real y devuelve TRUE si todas las comprobaciones son correctas. Funciona como la función checkdate() de PHP, pero también puede comprobar nombres de meses localizados y fechas que amplían el rango de checkdate()


26.4.5. Obtener fechas y partes de fecha

Varios métodos permiten recuperar valores relacionados con una instancia de Zend_Date.

Tabla 26.4. Métodos de salida de fecha

Método Explicación
toString()

toString($format = null, $locale = null)

Se invoca directamente o mediante el método mágico __toString(). El método toString() formatea automáticamente el valor del objeto de fecha según las convenciones de la configuración regional del objeto, o de una $locale especificada opcionalmente. Para ver una lista de los códigos de formato admitidos, consulte Self-Defined OUTPUT Formats with ISO.

toArray()

toArray()

Devuelve una representación en array de la fecha seleccionada según las convenciones de la configuración regional del objeto. El array devuelto es equivalente a la función getdate() de PHP e incluye:

  • Número de día como 'day' (Zend_Date::DAY_SHORT)

  • Número de mes como 'month' (Zend_Date::MONTH_SHORT)

  • Año como 'year' (Zend_Date::YEAR)

  • Hora como 'hour' (Zend_Date::HOUR_SHORT)

  • Minuto como 'minute' (Zend_Date::MINUTE_SHORT)

  • Segundo como 'second' (Zend_Date::SECOND_SHORT)

  • Zona horaria abreviada como 'timezone' (Zend_Date::TIMEZONE)

  • Marca de tiempo Unix como 'timestamp' (Zend_Date::TIMESTAMP)

  • Número del día de la semana como 'weekday' (Zend_Date::WEEKDAY_DIGIT)

  • Día del año como 'dayofyear' (Zend_Date::DAY_OF_YEAR)

  • Semana como 'week' (Zend_Date::WEEK)

  • Desfase de la zona horaria respecto a GMT como 'gmtsecs' (Zend_Date::GMT_SECS)

toValue()

toValue($part = null)

Devuelve una representación entera de la $part de fecha seleccionada, según las convenciones de la configuración regional del objeto. Devuelve FALSE cuando $part selecciona un valor no numérico, como Zend_Date::MONTH_NAME_SHORT.

[Note] Limitación de toValue()

Este método llama a get() y convierte el resultado a un entero de PHP, lo que dará resultados impredecibles si get() devuelve una cadena numérica que contiene un número demasiado grande para un entero de PHP en su sistema. Use get() en su lugar.

get()

get($part = null, $locale = null)

Este método devuelve la $part de la fecha del objeto, localizada según $locale, como cadena o entero con formato. Vea get() para más información.

now()

now($locale = null)

Esta función de conveniencia es equivalente a new Zend_Date(). Devuelve la fecha actual como un objeto Zend_Date, con la configuración regional $locale


26.4.6. Trabajar con fracciones de segundos

Varios métodos permiten recuperar valores relacionados con una instancia de Zend_Date.

Tabla 26.5. Métodos de salida de fecha

Método Explicación

getFractionalPrecision()

Devuelve la precisión de la parte de segundos

setFractionalPrecision()

Fija la precisión de la parte de segundos

26.4.7. Amanecer / Anochecer

Tres métodos permiten acceder a información geográficamente localizada sobre el Sol, incluyendo la hora del amanecer y del anochecer.

Tabla 26.6. Métodos varios

Método Explicación

getSunrise($location)

Devuelve la hora del amanecer de la fecha

getSunset($location)

Devuelve la hora del anochecer de la fecha

getSunInfo($location)

Devuelve un array con las fechas solares de la fecha