Una advertencia
En diferentes partes del planeta rigen zonas horarias distintas. La mayoría de los paises además cambian la hora segun la época del año. Son cuestiones que los programas deben tener en cuenta al manejar y calcular fechas.
Salvo que expresamente se indique otra cosa, las funciones PHP relacionadas con fechas se refieren al tiempo UTC, tambien llamado GMT, aunque dependiendo de la localización geográfica de tu servidor, posiblemente la fecha y hora del ordenador varien en algo respecto del UTC.
En general para trabajar con tiempos se aconseja ser consistentes en el uso de zonas horarias: "traducir" las fechas a tiempo UTC antes de manipularlas segun el fin del programa y al final volverlas a pasar a nuestra zona horaria. Otra regla que nos ayuda a trabajar con fechas es pensar en ellas no como conjunto de elementos (dia, mes, año) sino como un solo número entero.
Los creadores de PHP -y otros muchos lenguajes de programación- proponen describir una fecha concreta por el número de segundos trascurridos desde el epoch hasta ella.
Y en el principio fue Unix ...
La función time() nos devuelve un número entero con la información de la fecha y hora actual, expresada en número de segundos transcurridos desde el tiempo epoch, es decir, medianoche del 1 de enero de 1970 (Greenwich Mean Time). Por ejemplo el valor ahora mismo es 1267286806. A una fecha indicada en este formato se la conoce en php como timestamp
Estampando fechas
para calcular el timestamp de una fecha concreta, es decir, el número de segundos desde la medianoche del 1 de enero de 1970 hasta esa fecha, acudimos a la función mktime:
<?php
$MiTimesTamp = mktime(0,0,0,1,1,2005); // Calculando el timestamp de 1-1-2005
print mktime(0,0,0,1,1,2005); // vuelca 1104534000
print date("l",$MiTimeStamp); // El 1-1-2005 era sabado ...
?>
Los parámetros a pasar a maketime() son números indicando la hora, minuto, segundo, mes, dia y año, pudiendo pasar opcionalmente un valor booleano (0/1) para indicar si queremos que tenga en cuenta o no el horario de verano (dst )
Hay que recordar que mktime realiza sus calculos en base al tiempo UTC, pero los muestra con arreglo a la zona horaria del server. Por ejemplo con un server CEST, esta operación NO sería igual a cero:
<?php
print mktime(0,0,0,1,1,1970, 1) // muestra -3600
print gmmktime(0,0,0,1,1,1970, 1) // muestra 0
?>
Información de la fecha con getdate()
Pasando un timestamp a getdate() obtenemos un array con información desglosada de la fecha. Como en el resto de funciones de fecha, si no le pasamos ningun timestamp, la función trabaja sobre el timestamp actual.
Veamos cada uno de los elementos del array:
elemento valor -------- ----- seconds = 46 minutes = 6 hours = 8 mday = 27 wday = 6 mon = 2 year = 2010 yday = 57 weekday = Saturday month = February 0 = 1267286806
donde "seconds" son segundos, "minutes" minutos, "hours", horas, "mday" día del mes, "wday" día de la semana, en número, "mon" mes, en número, "year" año, en número, "yday" - día del año, en número, "weekday" día de la semana, en texto, completo; por ejemplo, "Friday" y "month" mes, en texto completo; por ejemplo, "January". Finalmente el primer elemento ("0") muestra el valor inicial del timestamp.
Formato mas legible con date()
Las funciones date() y gmdate() sirvan para dar el formato deseado a una cadena conteniendo una fecha.
Si no se pasa ninguna cadena a estas funciones, se da el formato al tiempo actual (calculado internamente con time().
La unica diferencia entre ambas es que gmdate() indica la hora del meridiano de Greenwich.
Jugando con fechas: el dia
modificadores | ejemplo | resultado |
d - día del mes, número, dos dígitos | | $ahora_es = 27 |
j - día del mes, número, dos dígitos sin cero inicial | | $ahora_es = 27 |
D - dia semana abreviado letras | | $ahora_es = Sat |
l - día de la semana, en texto, completo | | $ahora_es = Saturday |
w - día de la semana, en numero (comienza en 0 = domingo) | | $ahora_es = 6 |
Jugando con fechas: el mes
modificadores | ejemplo | resultado |
m - mes, número, dos dígitos | | $ahora_es = 02 |
n - mes, número, dos dígitos sin cero inicial | | $ahora_es = 2 |
M - mes, tres letras | | $ahora_es = Feb |
F - mes, texto completo | | $ahora_es = February |
t - total dias en el mes | | $ahora_es = 28 |
Jugando con fechas: el año
modificadores | ejemplo | resultado |
Y - año, cuatro cifras | | $ahora_es = 2010 |
y - año, dos cifras | | $ahora_es = 10 |
L - bisiesto? | | $ahora_es = 0 0 = no; 1 = si |
z - día del año | | $ahora_es = 57 |
W - semana del año | | $ahora_es = 08 |
Jugando con fechas: la hora
modificadores | ejemplo | resultado |
h - hora, de "01" a "12" | | $ahora_es = 08 |
g - sin ceros, de "1" a "12" | | $ahora_es = 8 |
H - hora, de "00" a "23" | | $ahora_es = 08 |
G - sin ceros, de "0" a "23" | | $ahora_es = 8 |
a - "am" o "pm" A - "AM" o "PM" | | $ahora_es = am |
Jugando con fechas: minutos
modificadores | ejemplo | resultado |
i - de "00" a "59" | | $ahora_es = 06 |
Jugando con fechas: segundos
modificadores | ejemplo | resultado |
s - de "00" a "59" | | $ahora_es = 46 |
Jugando con fechas: fechas completas
modificadores | ejemplo | resultado |
U segundos desde EPOCH epoch = 1 enero 1970 | | $ahora_es = 1267286806 |
r - formato RFC 2822 | | $ahora_es = Sat, 27 Feb 2010 08 |
c - formato ISO 8601 (solo en PHP 5) | | N/A |
Jugando con fechas: varios
modificadores | ejemplo | resultado |
S sufijo en texto, 2 caracteres; por ejemplo, "th", "nd" | | $ahora_es = 27th |
I - horario de verano | | $ahora_es = 0 0 = no 1 = si |
O - diferencia con hora Greenwich | | $ahora_es = -0800 |
T - zona horaria del server | | $ahora_es = PST |
Z diferencia en segundos zona horaria | | $ahora_es = -28800 |
B swatch internet time | | $ahora_es = 713 |
Comprobando fechas
checkdate(nMes nDia nAño) nos permite chequear si una fecha dada es posible: es decir, que no se trata del dia 32 del mes 13.
checkdate tiene en consideración años bisiestos, y es valido para un rango de años desde 0 a 32767
Y para mas flexibilidad, strftime()
la función date(), tan flexible como es, presenta dos problemas: no admite localización a idiomas distintos del inglés. Y si quieres emplear caracteres adicionales debes salvarlos:
<?php
print date("j \de F \de Y"); // como la "d" equivale al "dia" en número,
// si queremos que imprima una letra d y no el numero de mes,
// debemos emplear la barra \.
// no serviria escribir "j de F de Y"
?>
Sin que tampoco hayamos ganado mucho en estetica, ya que "27 dAmerica/Los_Angeles February dAmerica/Los_Angeles 2010" no queda muy bien. La solución pasa por indicar el mes en número y no en letra ... o usar strftime:
Hoy es Saturday, 27 de February de 2010.
<?php
setlocale(LC_TIME,"es_ES");
echo strftime("Hoy es %A, %e de %B de %Y." ,time());
?>
y estas son las opciones de formato. A la derecha añadimos las equivalentes de date():
opciones de strftime | opciones de date | ||
%a | dia semana (abreviado) | a | "am" o "pm" |
%A | dia semana (completo) | A | "AM" o "PM" |
%b | nombre mes (abreviado) | b | - |
%B | nombre mes (completo) | B | Swatch Internet time |
%c | representación preferida de dia y hora segun idioma del server | c | - |
%C | año en numero (00 - 99) | C | - |
%d | numero dia del mes (01 a 31) | d | numero dia del mes (01 a 31) |
%D | fecha abreviada, segun idioma server (%m/%d/%y, %y/%m/%d or %d/%m/%y) | D | dia de la semana, tres letras |
%e | dia del mes en numero (' 1' - '31') | %e | - |
%F | - | F | mes, en texto, completo; por ejemplo, "January" |
%g | - | g | hora, sin ceros, de "1" a "12" |
%G | - | G | hora, sin ceros; de "0" a "23" |
%h | igual que %b | h | h - hora, de "01" a "12" |
%H | hora, de "00" a "23" | H | hora, de "00" a "23" |
%I | hora como un número de 01 a 12 | I | - |
%i | - | i | minutos; de "00" a "59" |
%j | día del año como un número de 001 a 366 | j | día del mes sin cero inicial; de "1" a "31" |
%l | - | l | día de la semana, en texto, completo; por ejemplo, "Friday" |
%L | - | L | "1" o "0" segun el año sea bisiesto o no |
%m | mes como un número de 01 a 12 | m | mes: de "01" a "12" |
%M | minuto en numero | M | mes, en texto, 3 letras; por ejemplo, "Jan" |
%n | nueva linea | n | mes sin cero inicial; de "1" a "12" |
%N | - | N | - |
%p | 'am' o 'pm', según la hora dada, o las cadenas correspondientes en el idioma actual | p | |
%r | hora am pm | r | - |
%R | hora en formato 24 horas | R | - |
%S | segundos en número | S | sufijo ordinal en inglés, en texto, 2 caracteres; por ejemplo, "th", "nd" |
%s | - | s | segundos en numero |
%t | tabulador | t | número de días del mes dado; de "28" a "31" |
%T | Hora actual | T | - |
%U | segundos desde epoch | U | segundos desde epoch |
%w | día de la semana en número (el domingo es el 0) | w | día de la semana, en número (el domingo es el 0) |
%W | número de la semana en el año, empezando con el primer lunes como el primer día de la primera semana | W | - |
%x | representación preferida de la fecha sin la hora | x | - |
%X | representación preferida de la hora sin la fecha | X | - |
%y | año en número de 00 a 99 | y | año en número de 00 a 99 |
%Y | año en número de cuatro cifras | Y | año en número de cuatro cifras |
%z | - | z | día del año; de "0" a "365" |
%Z | nombre o abreviatura de la zona horaria | Z | diferencia horaria en segundos (de "-43200" a "43200") |
Equivalentes MySQL
Las fechas generadas con funciones MySQL tienen su propia estructura, básicamente inversa: año - mes -dia. Estos son los equivalentes:
<?php
$mysql_datetime = date("Y-m-d H:i:s");
$mysql_date = date("Y-m-d");
$mysql_time = date("H:i:s");
?>
No hay comentarios:
Publicar un comentario