Documentos de Académico
Documentos de Profesional
Documentos de Cultura
time, date
APRENDERAPROGRAMAR.COM
FUNCIONES DE TIEMPO,
FECHA Y HORA PHP: TIME,
DATE, FORMATOS DE
FECHA. MKTIME Y
GMMKTIME. EJEMPLOS.
(CU00830B)
Seccin: Cursos
Categora: Tutorial bsico del programador web: PHP desde cero
Fecha revisin: 2029
Resumen: Entrega n30 del Tutorial bsico PHP desde cero.
aprenderaprogramar.com, 2006-2029
aprenderaprogramar.com, 2006-2029
Aunque desde el punto de vista de su definicin tcnica UTC y GMT no son lo mismo, a efectos
prcticos hablar de GMT+3 es lo mismo que hablar de UTC+3.
A pesar de este gran avance, el trabajo con el tiempo sigue presentando grandes dificultades en los
sistemas informticos, tanto por la falta de sincronizacin entre dispositivos como por la disparidad en
cuanto a cmo medir el tiempo y con qu grado de precisin, existencia de horarios de verano e
invierno, etc. Por ello encontrars que es relativamente frecuente encontrar que a medida que los
lenguajes de programacin evolucionan vayan introduciendo cambios en la forma de manejar el
tiempo.
Una cuestin a tener en cuenta es que el tiempo oficial de Greenwich, tiempo GMT UTC, no se
corresponde con el tiempo local en Greenwich debido a la existencia del horario de verano. Por
ejemplo, Lisboa se encuentra en el huso horario de Greenwich, pero en verano la hora local est
adelantada una hora respecto al tiempo oficial de Greenwich por motivos de ahorro energtico. Esto da
lugar a que el 5 de agosto a las 21:00 en Lisboa se corresponda con el 5 de agosto 20:00 UTC debido al
horario de verano, a pesar de que Lisboa se encuentre en el mismo huso horaria que Greenwich.
aprenderaprogramar.com, 2006-2029
En este ejemplo hemos especificado como formato para mostrar la fecha d-m-Y (H:i:s) (donde d
representa da, m representa mes, Y representa ao, H representa hora, i representa minutos y s
representa segundos) desde el valor de time u otra fecha dada en segundos desde el 1 de Enero de
1970 00:00:00 GMT.
Como podemos observar, la funcin date da formato a la variable en segundos $time. Hay distintos
formatos para la funcin date, a continuacin indicaremos los ms importantes.
La funcin time() devuelve un valor numrico entero largo, por ejemplo 1335169779. Este nmero
representa el nmero de segundos transcurridos desde el 1 de enero de 1970 00:00:00 GMT.
Para transformar ese nmero en una fecha entendible por las personas usamos la funcin date, cuya
sintaxis general es: date (formato de salida, valorTimeValido)
En cuanto a valorTimeValido, ser un nmero entero, generalmente contenido en una variable.
En cuanto a formato de salida, disponemos de las siguientes equivalencias:
Significado aprenderaprogramar.com
d (minscula)
01 a 31
D (mayscula)
j (minscula)
1 a 31
N (mayscula)
1 (lunes) a 7 (domingo)
S (mayscula)
st, nd, rd th
w (minscula)
0a6
z (minscula)
0 a 365
aprenderaprogramar.com, 2006-2029
Significado aprenderaprogramar.com
F (mayscula)
m (minscula)
01 hasta 12
M (mayscula)
n (minscula)
1 hasta 12
t (minscula)
28 hasta 31
Carcter de formato
Significado aprenderaprogramar.com
L (mayscula)
01
Y (mayscula)
1000 a 9999
y (minscula)
o (minscula)
1000 a 9999
Significado aprenderaprogramar.com
a (minscula)
am pm
A (mayscula)
AM PM
B (mayscula)
000 a 999
g (minscula)
1 a 12
G (mayscula)
0 a 23
h (minscula)
01 a 12
H (mayscula)
00 hasta 23
i (minscula)
00 a 59
s (minscula)
00 a 59
aprenderaprogramar.com, 2006-2029
Significado aprenderaprogramar.com
e (minscula)
Segn corresponda
I (letra i mayscula)
01
O (letra o mayscula)
P (mayscula)
T (mayscula)
Segn corresponda
Z (mayscula)
aprenderaprogramar.com, 2006-2029
Con este ejemplo podemos comprobar algunas cosas. En primer lugar, que la funcin time() devuelve
un nmero, mientras que la funcin date devuelve un String o cadena de texto.
En segundo lugar, que para obtener fechas anteriores al 1 de enero de 1970 debemos usar nmeros
negativos.
En tercer lugar, que el momento 0 que es el 01-01-1970 00:00:00 GMT, cuando es mostrado por un
servidor concreto, es adaptado a su horario local. En el servidor del ejemplo, el horario local es GMT +
01:00, es decir, su hora es la hora GMT +01:00, por eso nos devuelve como hora cero la una de la
maana del 1 de enero de 1970. No te preocupes si te resulta un poco confuso, simplemente ten en
cuenta que debes hacer pruebas para ver cmo responde el servidor con el que ests trabajando.
En cuarto lugar, que podemos hacer que la fecha se muestre en el formato u orden que queramos,
usando los trminos clave d, m, Y, H, i, s en el orden que queramos.
En quinto lugar, que podemos concatenar cmo se muestra una fecha (o almacenarla en otra variable si
quisiramos) concatenando el resultado de la funcin date con una cadena de texto cualquiera.
aprenderaprogramar.com, 2006-2029
mktime(hora,min,seg,mes,
dia,ano)
hora: 0 a 23
min y seg: 0 a 59
mes: 1 a 12
dia: 1 a 31
ao: cuatro dgitos
gmmktime(hora,min,seg,
mes,dia,ano)
hora: 0 a 23
min y seg: 0 a 59
mes: 1 a 12
dia: 1 a 31
ao: cuatro dgitos
UTILIDAD
Devuelve la hora UTC (GMT) para una fecha
local indicada, expresada esta hora GMT en
segundos
(el
nmero
de
segundos
transcurridos desde el 1 de enero de 1970
00:00:00 GMT, valores negativos indican
momentos anteriores a esta fecha). Si faltan
uno o ms parmetros se tomarn los de la
fecha local actual de derecha a izquierda. El
valor obtenido depende de la hora local del
servidor con el que estemos trabajando.
Devuelve la hora UTC (GMT) expresada en
segundos para una fecha GMT indicada en los
argumentos recibidos. El valor devuelto es el
nmero de segundos transcurridos desde el 1
de enero de 1970 00:00:00 GMT, valores
negativos indican momentos anteriores a esta
fecha. Si faltan uno o ms parmetros se
tomarn los de la fecha GMT actual de derecha
a izquierda. El valor obtenido no depende del
servidor, ya que la hora GMT es nica.
EJEMPLOS aprenderaprogramar.com
gmmktime(12,0,0,1,15,2089)
// 3756628800 independientemente de la
hora local del servidor
Nota: tener en cuenta que usamos UTC GMT como si fueran equivalentes.
Para entender cmo las funciones time y mktime trabajan con tiempo local hemos realizado la
siguiente prueba. Hemos colocado el siguiente cdigo en un servidor en Denver (USA), y en un servidor
en Madrid (Espaa):
echo "Tiempo Unix para el 15-Enero-2089 a las 12h 0m 0s = " . mktime(12,0,0,1,15,2089);
El resultado obtenido en Denver (USA) es 3756654000
El resultado obtenido en Madrid (Espaa) es 3756625200
Por qu obtenemos un resultado diferente?
La diferencia entre uno y otro tiempo es de 28800 segundos, que equivalen a 8 horas.
Hemos comprobado la hora en Denver en el momento de realizar el test y eran las 06:20:00 de la
maana, mientras que en Madrid eran las 14:20:00 horas. Como vemos, tenemos una diferencia
horaria de 8 horas entre Denver y Madrid.
aprenderaprogramar.com, 2006-2029
Cuando en Madrid son las 12:00 horas del 15 de enero de 2089, en Denver sern las 04:00 horas del 15
de enero de 2089. Las 12:00 horas de un da tienen lugar en distintos instantes de tiempo en Denver y
en Madrid, por eso los resultados indican que cuando son las 12 horas en Denver ha transcurrido ms
tiempo desde las 0 horas del 1 de enero de 1970 GMT que cuando son las 12 horas en Madrid, o dicho
de otra manera, las 12 horas de un da tienen lugar antes en Madrid que en Denver. El tiempo Unix s
ser igual si pedimos el valor mktime(4,0,0,1,15,2089) en Denver: obtendremos 3756625200, el mismo
resultado que en Madrid a las 12 del medioda. Esto indica que ese instante de tiempo (4 de la maana
de 15 de enero de 2089 en Denver y 12 de la maana de la misma fecha en Madrid) es el mismo
instante, es decir, podramos estar hablando por telfono dos personas en ese momento, siendo las 4
de la maana en Denver y las 12 en Madrid.
Si pedimos la hora en Madrid para el 1 de enero de 1970 a las 00:00:00 de 1970 nos devuelve <<Tiempo
Unix para el 1 de enero de 1970 a las 00:00:00 = -3600>> Qu significa -3600? Este valor est referido
al tiempo UTC e indica qu adelanto o atraso (en segundos) tiene la hora local respecto al tiempo UTC.
O dicho de otro modo, cunto tiempo ha transcurrido desde las 00:00 horas del 1 de enero de 1970
UTC dada una fecha local. Cuando en Madrid son las 00:00:00 del 1 de enero de 1970 en el tiempo UTC
de referencia (podemos pensar que es la hora en Greenwich, meridiano de referencia, aunque esto no
es exacto) decimos que faltan 3600 segundos (1 hora) para llegar al 1 de enero de 1970. El valor
negativo indica que la fecha es anterior al 1 de enero de 1970 00:00:00 GMT, y en concreto en este caso
seran las 23 horas del 31 de diciembre de 1969 GMT cuando en Madrid son las 00:00:00 horas del 1 de
enero de 1970.
Si pedimos la hora en Denver para el 1 de enero de 1970 a las 00:00:00 de 1970 nos devuelve <<Tiempo
Unix para el 1 de enero de 1970 a las 00:00:00 = 25200>> Qu significa 25200? Este valor est referido
al tiempo UTC e indica que cuando en Denver son las 00:00:00 del 1 de enero de 1970 el tiempo UTC
de referencia est 7 horas por delante, es decir, a las 0 horas en Denver son las 7 horas UTC.
-3600 segundos equivalen a 1 hora por delante de GMT. En invierno en Madrid la hora local es
GMT+0100
25200 segundos equivalen a 7 horas por detrs de GMT. En invierno en Denver la hora local es GMT0700
Tener en cuenta que la hora UTC (GMT) es nica (la indicada por los organismos internacionales
encargados), mientras que las hora locales varan segn el pas, e incluso segn la zona de un pas en
que nos encontremos.
Existen ms funciones para fechas y tiempo en PHP pero los programadores no las suelen conocer
todas, ya que algunas son para tareas muy especficas. No te preocupes por memorizar las funciones ni
por conocerlas todas, simplemente s consciente de su existencia y aprende a buscarlas cuando te
resulten necearias. Si en algn momento necesitas realizar tareas muy especficas con tiempo y fechas
en PHP puedes conocer todas las funciones existentes sobre esta materia acudiendo a la
documentacin
oficial
de
PHP
sobre
fecha
y
hora,
disponible
en
http://php.net/manual/es/ref.datetime.php
aprenderaprogramar.com, 2006-2029
EJERCICIO
Crea un documento HTML que conste de un ttulo h1 con el texto <<Calendario>>. En la pgina deber
mostrarse el mes y ao actuales (en el momento en que hagas el ejercicio) y para cada da del mes,
indicar si es lunes, martes, mircoles, jueves, viernes, sbado o domingo.
Ejemplo: suponiendo que hagas el ejercicio en mayo de 2050, debera mostrarse:
Da 1: Domingo, Da 2: Lunes, Da 3: Martes, Da 4: Mircoles, etc. hasta Da 31: Martes.
Ampliacin voluntaria del ejercicio: si tienes conocimiento de maquetacin con HTML y CSS te
proponemos que cambies el aspecto para que en lugar de mostrarse como texto, el calendario se
muestre con aspecto de calendario habitual. Para la maquetacin puedes usar una tabla de 7 columnas
por 7 filas (total 49 celdas) con ancho de tabla 300 pxeles y tamao de fuente en la tabla 24 pxeles. La
primera columna corresponder a lunes y la ltima a domingo como mostramos en el siguiente
ejemplo.
El aspecto, suponiendo que te encuentras en el mes de mayo de 2050, sera el siguiente:
MAYO DE 2050
Lu Ma Mi Ju Vi Sa Do
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Ten en cuenta que debe generarse el calendario del mes en que te encuentres segn la hora local del
sistema (de tu servidor).
Para comprobar si tus respuestas y cdigo son correctos puedes consultar en los foros
aprenderaprogramar.com.
aprenderaprogramar.com, 2006-2029