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.
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
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.
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.
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)).
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).
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');
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.
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 |
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() |
Use
|
|||
set() |
Asigna a la |
|||
add() |
Suma la |
|||
sub() |
Resta la |
|||
copyPart() |
Devuelve un objeto clonado, con solo la |
|||
compare() |
compara la |
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() |
devuelve |
isEarlier() |
devuelve |
isLater() |
devuelve |
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() |
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() |
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() |
Use |
isDate() |
Este método comprueba si una fecha dada es una fecha real y devuelve
|
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() |
Se invoca directamente o mediante el método mágico
|
|||
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:
|
|||
toValue() |
Devuelve una representación entera de la
|
|||
| get() |
Este método devuelve la |
|||
now() |
Esta función de conveniencia es equivalente a new
Zend_Date(). Devuelve la fecha actual como un
objeto |
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 |
|---|---|
|
|
Devuelve la precisión de la parte de segundos |
|
|
Fija la precisión de la parte de segundos |
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 |
|---|---|
|
|
Devuelve la hora del amanecer de la fecha |
|
|
Devuelve la hora del anochecer de la fecha |
|
|
Devuelve un array con las fechas solares de la fecha |
![[Note]](images/note.png)