oscardixit

Como restar dos fechas varchar en PHP y no morir en el intento

El otro día me vinieron con un problema, necesitaba restar dos fechas para conocer la diferencia en minutos entre ellas, me vinieron a la mente varias soluciones directamente en la consulta SQL, pero el problema tenía una trampa, las fechas estaban en formato VARCHAR (¡horror!) y guardadas de dos maneras distintas, con este aspecto “21 de enero de 2013 15:35:33 GMT+01:00” y este otro “21 de enero de 2013 15:37:43“, o sea algunas venía con el GMT+01:00 y otras no.

Pues bien, ya tenía un pequeño reto para esa tarde, seguramente haya varias soluciones a este problema, yo aquí expondré la que se me ocurrió a mi ;)

Una vez olvidada toda solución en la consulta SQL (¡lastima!, siempre que puedas resolver tu problema directamente en BBDD, jamás lo hagas en el código), esperé que PHP fuera mi aliado :D

Lo primero de todo, había que volver cristianas esas fechas, la programación no es magia, no puedes decirle réstame 21 de enero de 2013 15:35:33 menos 21 de enero de 2013 15:37:43 y dame como resultado 2 minutos, así que la función que me salió en ese momento de inspiración fue la siguiente:

/*
	Función que transforma una fecha en formato "dd de mm de aaa hh:mm:ss GMT+01:00" a formato "m/dd/aaahh:mm:ss"
*/
function format_date($fecha) {
	$fuera_gmt = str_replace("GMT+01:00", "", $fecha);
	$fuera_de = str_replace("de", "/", $fuera_gmt);
	$fuera_espacios = str_replace(" ", "", $fuera_de);
	$meses = array("enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre");
	for($i=0; $i<12;$i++) {
		$busca_mes = strpos ($fuera_espacios, $meses[$i]);
		if ($busca_mes !== false) {
			$convertir_mes = str_replace($meses[$i], $i+1, $fuera_espacios);
		}

	}
	$fecha_split = split("/", $convertir_mes);
	$fecha_formateada = $fecha_split[1] . "/" . $fecha_split[0] . "/" . $fecha_split[2];
	return $fecha_formateada;
}

Lógicamente es una función adaptada al problema en concreto, por eso procuro quitar los GMT, transformar los “de” en “/” y los meses en su correspondencia numerica (enero es 01, diciembre es 12), así que usando como base esta función, deberás cambiarla para que convierta desde el formato de tus fechas ;)

Una vez que tenemos convertida la horripilante fecha 21 de enero de 2013 15:35:33 GMT+01:00 en algo más aceptable como 01/21/201315:35:33, el problema se vuelve más sencillo, ya podemos restar fechas con ese formato para conocer la diferencia entre ellas, en este caso la función salió una cosa como esta:

/*
	Función que recibiendo dos fechas, nos devuelve los minutos de diferencia entre ellas
*/
function restaFechas($fecha_principal, $fecha_secundaria){

	//Formato
	$faux1 = format_date($fecha_principal);
	$faux2 = format_date($fecha_secundaria);

	//Fecha a Timestap de Unix
	$fecha1 = strtotime($faux1);
	$fecha2 = strtotime($faux2);

	//Comprobar que una fecha es mayor que la otra para la resta
   	if ($fecha1 < $fecha2) {
   		$tmp = $fecha2;
   		$fecha2 = $fecha1;
   		$fecha1 = $tmp;
   	}
   	$resultado = ($fecha1 - $fecha2);
   	$resultado = $resultado / 60; //Paso a minutos
   	$resultado = round($resultado); //Redondeo
   	return $resultado;
}

A esta función, restaFechas, es a la que hay que llamar para que nos devuelva la diferencia entre las dos fechas, desde la cual llamamos a la otra función format_date y después una vez convertidas a la fecha en formato UNIX con la apreciada función PHP strtotime, podamos restarlas.

Como en este caso en concreto queremos que nos de el resultado en minutos dividimos el resultado de la resta por 60, si quieres que la diferencia nos la muestre en horas, se divide dos veces por 60 (/60/60), o si las fechas son tan alejadas que te merece más la pena la diferencia en días, a parte de dos veces por 60, divides también por 24 (/60/60/24).

Espero que os sea de ayuda este ejemplo :)

Miríada X, cursos online gratuitos

miriadax
Hace una semana descubrí esta interesante plataforma llamado Miríada X, en donde imparten MOOC’s (Cursos Online Masivos en Abierto) gratuitos preparados por las universidades iberoamericanas que conforman la Red Universia.

Yo en concreto me he apuntado, por el momento, a cuatro cursos que son de mi total interés:

Tanto el de Android como el de desarrollo web ya han comenzado y estoy totalmente inmerso en ellos (no llegas tarde, aún puedes apuntarte) y el de inglés y Álgebra comenzarán en próximas fechas, me gusta mucho como está hecha la plataforma, lo sencillo que es seguir los cursos y todo lo que está a tu alcance (blogs, foros, contacto con otros alumnos y profesores, etc), llega a sorprender que todo esto sea de forma gratuita.

Si visitas su apartado de cursos puedes ver cuantas temáticas llegan a afrontar y estoy convencido que alguno de ellos puede interesarte y ya no tienes ninguna excusa, solo necesitas una conexión a internet, un poco de tiempo y ganas por aprender :)

Poner un contador de caracteres máximos en una caja de texto

Un clásico, quieres que en tu formulario no se pasen escribiendo un texto, acotas la cantidad de caracteres a un número máximo y, como ayuda para quien lo rellena, le muestras cuantos caracteres lleva escritos.

Aquí el código, usando HTML y Javascript, listo para hacerle un copy/paste ;)

<html>
<head>
 <title>Contador</title>
 <script>
 function contador(texto){
 ncaracteres=texto.length
 if(ncaracteres>99){
 document.getElementById("texto").value=texto.substring(0,99)
 }
 document.getElementById("cont_total").value=ncaracteres;
 }
 </script>
</head>
<body>
 <form>
 <textarea cols="20" rows="5" name="texto" id="texto" onkeydown="contador(this.value)"></textarea>
 <input type="text" name="cont_total" id="cont_total" size="3" maxlength="3" value=0 readonly>
 </form>
</body>
</html>

Nota: Para insertar este formato de código en el post de WordPress he utilizado el plugin SyntaxHighlighter Evolved, queda bien ¿eh?

8 maneras de ser un desarrollador web más productivo

Interesante lista de ocho consejos para llegar a ser productivo en tu trabajo como desarrollador web (realmente como desarrollador en general), algunas pueden ser de perogrullo, pero el lio del día a día puede obligarte a olvidarte de seguir estos consejos, a la larga es mejor ser un poco ordenado, ¿no? ;)

Bonus Track:

Cuando termines y te empapes de esos ocho consejos, sigue leyendo 8 cosas que deberíamos comprobar antes de lanzar un sitio web :P

Un nuevo informe Forrester indica que ya es hora de usar HTML5

El miedo de las empresas de no usar todavía HTML5, porque no lo soportan la mayoría de los navegadores, debe terminar, según un informe de Forrester, ya indica que cerca del 75% de usuarios de EEUU y un 83% de Europeos utilizan navegadores que soportan gran parte de las novedades que trae HTML.

Según Forrester el crecimiento de los navegadores compatibles con HTML5 ha crecido de un 57% al 75% en tan solo un año, así que amigos, no hay duda, ya podemos programar con HTML5 sin miedo a que tu cliente no vea correctamente la web y ya sabes, si es el típico vintage que usa IE6, instálale Chrome, ¡alma de cántaro!

Vía.

Los 100 errores más habituales de HTML

Leo en Barrapunto que la web de validación W3C tiene unas estadísticas con los 100 errores de validación de HTML más comunes de las más de medio millón de páginas validadas.

El más común es no incluir el atributo “alt” en las imágenes, ya saben, lo que utilizamos para describir lo que nos muestra las imágenes, la segunda es utilizar “&” en vez de “&amp” y la tercera es no cerrar las etiquetas “img” con su correspondiente “/>”, bueno esto es más discutible, ya que en HTML5 se termino esta costumbre, ya no es necesario cerrar las etiquetas (yuhu!).

La verdad es que repasando la lista, son errores bastante habituales, que no suelen afectar al resultado final de la página… pero si podemos evitarlos… casi que mejor ;)

Buenas prácticas con HTML5 (Actualizado)

HTML 5 está de moda, yo poco a poco me voy haciendo fan de él y empiezo a acostumbrarme a pensar “a su estilo”, si quieres empezar a desarrollar en este lenguaje, a parte de mirar un buen manual y observar el código de los demás, no está de más adquirir unas buenas práticas y convertirlas en costumbre, al final no cuesta tanto ;)

Actualización.

Parece que está de moda las buenas prácticas, hoy he encontrado este artículo con 10 buenas prácticas para escribir código HTML, ¡ya no tienes excusa! ;)

Empezando como si fuera el primer día

Borrón y cuenta nueva, eso es lo que he decidido con mi blog personal que durante todo el 2012 lo he tenido totalmente abandonado, mi blog personal empezó a carecer de sentido cuando más crecía mi participación en las redes sociales, lo que quería contar o compartir me era satisfecho allí.

Eso me creó un problema, que hacer con ese blog en el que había estado escribiendo desde el 2007 y la solución es esto que ves, empezar de cero y dedicarlo a algún tema en concreto, la programación, una de las cosas que apenas he tratado en los distintos blogs en los que he participado.

Es verano, igual no es la mejor época para comenzar una tarea como esta, pero ¡qué demonios! :)