Trabajando con fechas en PHP

Trabajar con fechas es una tarea muy común pero a veces complicada si no entendemos bien como hacerlo. Con unas pequeñas funciones PHP podemos manejar e imprimir fechas asi como guardarlas en base de datos.

Funciones Básicas
Para el manejo de fechas hay tres funciones básicas en PHP que harán la mayoría del trabajo necesario en la manipulación de fechas.

  • time(): devuelve la fecha y hora actual expresada en segundos (desde el 1 de enero de 1970 – llamada timestamp). Como devuelva la fecha en un entero se puede utilizar para sumar o restar fechas así como guardarla en base de datos.
  • date(): devuelve la fecha de acuerdo al formato que definamos (Mas información de como formatear la fecha en PHP: date – Manual). Esta función sirve para imprimir las fechas en formatos legibles para los visitantes.
  • strtotime(): convierte una texto en fecha expresada en timestamp.

Entonces, resumiendo la time() devolverá la fecha para poder manipularla posteriormente y date() dará formato legible para los usuarios.

Veamos unos ejemplos de uso de la función time:

php
  1. // imprimir la hora actual
  2. echo time(); // 1270966374
  3. // imprimir dos horas antes de la hora actual
  4. echo (time()-2*60*60); // 1270959174
  5. // imprimir la fecha de hace una semana
  6. echo (time()-7*24*60*60); // 1270361574

Ahora veamos como utilizar la función date:

php
  1. // imprimir la fecha actual
  2. echo date("d/m/Y"); // 10/04/2010
  3. // imprimir la hora actual
  4. echo date("h:m:s a"); // 10:04:52 pm
  5. // imprimir dos horas antes de la hora actual
  6. echo date("h:m:s a", time()-2*60*60); // 08:04:52 pm

Las fechas y el Timezone
El timezone o zona horaria es la hora de cada localidad de acuerdo a su ubicación en la tierra respecto a una hora universal. Pueden conocer el timezone de su localidad en World Time Zone, por ejemplo si estamos en Lima – Perú, el timezone es -5.

Ahora, si imprimimos una fecha utilizando directamente la función date(), esta lo hará pero basado en la zona horaria de mi proveedor de hosting. Para corregir esto es necesario hacer un ajuste de acuerdo al timezone nuestro y de nuestro servidor de hosting.

Creamos una función llamada dateZone que recibe dos parámetros: primero el formado que deseamos imprimir basado en la documentación (PHP: date – Manual) y el segundo parámetro es el timezone de nuestra ciudad.

php
  1. function dateZone($fmt, $zone = 0) {
  2.     return date($format, time() - date("Z") + $zone*3600); 
  3. }

Veamos un ejemplo de uso de esta función comparada con la función date y otra utilizando la zona horaria de Lima.

php
  1. echo date("h:i:s  a - d/m/Y"); // 11:40:22 pm - 10/04/2010
  2. echo dateZone("h:i:s  a - d/m/Y", -5); // 01:40:22 am - 11/04/2010

Fechas para generación de RSS
Si deseamos generar un Feed con las noticias de nuestro web, es recomendable hacerlo en el formato RSS 2.0, para ello es necesario generar la fecha de cada item en un formato especial. Crearemos una función llamada dateFeed, que recibe como parámetro la fecha en formato timestamp.

php
  1. function dateFeed($date) {
  2.     return date('D, d M Y h:i:00 \G\M\T', $date);
  3. }

Luego podríamos utilizar esta función de la siguiente forma:

php
  1. // Imprimir la fecha actual para Feed
  2. echo dateFeed(time(), -5); // Sun, 11 Apr 2010 12:28:00 GMT
  3. // Imprimir el 10 de abril del 2010 para Feed
  4. echo dateFeed(strtotime("2010-04-10")); // Sat, 10 Apr 2010 12:00:00 GMT
  5. // Imprimir el 11 de abril del 2010 basado en el timestamp para Feed
  6. echo dateFeed(1270966374) // Sat, 10 Apr 2010 11:12:00 GMT

Son funciones sencillas que les sacarán de muchos apuros. Si tienen alguna función que pueda ser útil no duden en compartirla con nosotros dejando un comentario.

Comentarios Total 14 comentarios


Gabriel
Publicado: 11/04/2010 1:11 pm

Justo unos minutos antes de ver este post, arme una función para mostrar la fecha y hora al estilo de facebook (Hace 1 minuto, Hace 1 semana y 2 días, etc..). La dejo por si alguien la encuentra útil:


function timesince($original) {
$ta = array(
array(31536000, "Año", "Años"),
array(2592000, "Mes", "Meses"),
array(604800, "Semana", "Semanas"),
array(86400, "Día", "Días"),
array(3600, "Hora", "Horas"),
array(60, "Minuto", "Minutos"),
array(1, "Segundo", "Segundos")
);
$since = time() - $original;
$res = "";
$lastkey = 0;
for( $i=0; $i<count($ta); $i++ ){
$cnt = floor($since / $ta[$i][0]);
if ($cnt != 0) {
$since = $since - ($ta[$i][0] * $cnt);
if($res == ""){
$res .= ($cnt == 1) ? "1 {$ta[$i][1]}" : "{$cnt} {$ta[$i][2]}";
$lastkey = $i;
} else if ($ta[0] >= 60 && ($i - $lastkey) == 1 ){
$res .= ($cnt == 1) ? " y 1 {$ta[$i][1]}" : " y {$cnt} {$ta[$i][2]}";
break;
} else {
break;
}
}
}
return $res;
}

David
Publicado: 12/04/2010 7:46 pm

Ola, muy buena explicacion pero si esque un usuario desea mostrar la fecha como por ejemplo:
“Lunes 12 de Abril de del 2010″, se puede hacer de la siguiente forma o al menos es la que mas me sirve ami:

;D

David
Publicado: 12/04/2010 8:07 pm

jejej no salio lo que puse -.- !

set_locale(LC_ALL,"es_ES@euro","es_ES","esp"); // Definimos el idioma
echo strftime("%A %d de %B del %Y"); // Mostrando ...

Juan
Publicado: 15/04/2010 5:53 pm

y como pongo fechas como youtube que cuando buscas videos en los resultados te sale “hace 10 meses” o algo asi

Tom
Publicado: 21/04/2010 8:17 pm

Lamento informar que strtotime en 5.3.x cambio y no acepta mas HH:MM
Por lo que me vi forzado a pasar mis scripts a mktime(), parseando la hora y pasandola como numero en parametros.
Una lastima.

Cristian
Publicado: 07/05/2010 8:03 pm

Como se le hace para calcular los dias entres dos fechas, por ejemplo:

02-03-2010 – 01-03-2010 = 1 día.

Un saludo.

unijimpe
Publicado: 08/05/2010 9:48 pm

Para hacer el calculo de las fechas, debes convertirlas primero al formato timestamp, luego puedes sumarlos y restarlos para finalmente convertirlos al formato que deseas:

$lapso = strtotime('2010-03-02') - strtotime('2010-03-01');
echo ($lapso/24*60*60);


[...] Fonte: unijimpe.net [...]

Charles
Publicado: 24/05/2010 11:11 am

@David:

set_locale(LC_ALL,"es_ES@euro","es_ES","esp"); // Definimos el idioma
echo strftime("%A %d de %B del %Y"); // Mostrando ...

La función set_locale con los párametros asignados en el ejemplo sólo funciona en servidores sobre GNU/Linux para hacerlo funcionar en Windows hay cambiar algunas cosas.

http://php.net/manual/es/function.setlocale.php

Saludos

Amy
Publicado: 03/06/2010 6:25 pm

Justo unos minutos antes de ver este post, arme una función para mostrar la fecha y hora al estilo de facebook (Hace 1 minuto, Hace 1 semana y 2 días, etc..). La dejo por si alguien la encuentra útil: function timesince($original) { $ta = array( array(31536000, "Año", "Años"), array(2592000, "Mes", "Meses"), array(604800, "Semana", "Semanas"), array(86400, "Día", "Días"), array(3600, "Hora", "Horas"), array(60, "Minuto", "Minutos"), array(1, "Segundo", "Segundos") ); $since = time() - $original; $res = ""; $lastkey = 0; for( $i=0; $i= 60 && ($i - $lastkey) == 1 ){ $res .= ($cnt == 1) ? " y 1 {$ta[$i][1]}" : " y {$cnt} {$ta[$i][2]}"; break; } else { break; } } } return $res; }

nahuel
Publicado: 07/09/2010 8:37 pm

Hola alguien me podria decir como mostrar en pantalla algo si es determinado dia a determinada hora

estoy tratando con esto

$result=false;
$date =& JFactory::getDate();
$dia= $date->toFormat('%A');
$hora= (int)$date->toFormat('%H')+2;
if($dia=='Tuesday' && $hora>=20 && $hora<21)
{
$result=true;
}

return ($result);

Santiago
Publicado: 21/03/2011 4:08 pm

Hola tengo un pequeño problema al utilizar tu función
me devuelve como resultado:

41 Años y 2 Meses

Desde ya gracias!

Jose Ynga
Publicado: 28/10/2011 3:04 am

Muy Bueno el posto, pero yo queria uno del cual yo doy la fecha y la hora en un formato y que se cambie al formato para ingresar a la bd. asi que lo modifique. con su permiso envio:
function ForFechaHora($fecha){
list($dia,$mes,$anio)=explode(“/”,$fecha);
list($anio,$hora)= explode(” “,$anio);
return $anio.”-”.$mes.”-”.$dia.” “.$hora;
}
echo ForFechaHora(’28/10/2011 03:32:13′);
resultado.:
2011-10-28 03:32:13
jiji ahora si a registrarlo a la BD.

Ramon Carrasquel
Publicado: 18/08/2013 11:09 pm

Buenas noches. tengo un sistema de control de asistencias pero quiero generar un reporte general de empleados por departamento en un rango de fechas con la finalidad de ver cuantos dias asistio al trabajo dicho empleado.

 

Comentar

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)