fLIPIS
   

Trabajando con tiempo en PHP


      
PHP también tiene una serie de funciones específicamente hechas para trabajar con fechas. De ellas, vamos a ver unas cuantas que son realmente útiles. La documentación INTEGRA de PHP y sus funciones de tiempo se puede encontrar (en español) en esta página. La primera función que vamos a ver en checkdate(). Ésta función tiene tres argumentos, y comprueba que una fecha es la correcta. Los argumentos son, por orden: mes, día, año. No obstante, he hecho una clase para encapsular toda la funcionalidad que vamos a ver en el tutorial, así que pongo el código de la misma.
   
   
<?php
public static function isCorrectDate($day, $month, $year)
{
   return checkdate($month, $day, $year);
}
?>
      
Esta función es muy útil para ver si en un formulario nos han introducido datos incorrectos. Al ser estática, no es necesario instanciar la clase para comprobar las fechas de esta forma, accederíamos a ella como LittleTimeTool::isCorrectDate($dia, $mes, $año). La siguiente función a ver es time(). Es muy simple, no tiene argumentos, y devuelve el instante UNIX actual. La clase tiene un método encapsulado que nos permite obtener un instante UNIX de ahora mismo o de un momento del pasado o del futuro.
   
   
<?php
public static function gimmeSomeTime($sec = 0, $min = 0, $hour = 0, $day = 0, $month = 0, $year = 0)   
{
   $seconds = intval(date("s") + $sec);
   $minutes = intval(date("i") + $min);
   $hours = intval(date("H") + $hour);
   $days = intval(date("j") + $day);
   $months = intval(date("n") + $month);
   $years = intval(date("Y") + $year); 
   return mktime($hours, $minutes, $seconds, $months, $days, $years);
}
?>
      
Si al método no se le pasan argumentos, devuelve el instante UNIX actual, pero admite una cantidad de tiempo agregado o restado. Al igual que el anterior método, es estático. Como se ve, lo que hacemos es encapsular la función mktime() en una llamada a la que podemos pasarle como argumentos tiempo para sumar o restar al momento actual. Bastante útil si queremos asegurarnos de que algo se hace en un momento concreto del futuro, o para saber exactamente un margen de tiempo para consultas a nuestra base de datos. Por ejemplo, podríamos hacer lo siguiente:
   
   
<?php

$fiveMoreDays = LittleTimeTool::gimmeSomeTime(0,0,0,5);
$fiveLessDays = LittleTimeTool::gimmeSomeTime(0,0,0,-5);
$sqlTenDays = "SELECT * FROM tabla WHERE campo_unixtimestamp BETWEEN (".$fiveLessDays." AND ".$fiveMoreDays.")";

?>
      
De esta forma, podríamos hacer una SQL que coja un rango de diez días, cinco en el futuro, y cinco en el pasado, desde el instante actual, para capturar registros de una tabla. Este tipo de operación también es realizable con campos timestamp, pero desde mi punto de vista (y es solo una opinión), este modo de trabajo es mas sencillo en tanto que nos permite definir una fecha sin tener que saber exactamente qué fecha es. Solo tenemos que saber cuanto tiempo queremos que pase desde ahora mismo para definirla. Si necesitásemos una fecha concreta, llamaríamos a mktime(), como vemos aquí:
   
   
<?php
$fechaFinDelMundoMaya_UNIX = mktime(11, 59, 59, 12, 31, 2012);
?>
      
Con lo que obtendríamos el instante unix del 31 de diciembre de 2012, a las 11:59:59, según los mayas y algunos profetas de internet, el momento de un apocalispis predicho. Sin entrar en temas de esta índole, baste decir que con mktime() y el encapsulamiento que hemos hecho, tenemos a nuestra disposición todos los instantes unix que necesitemos para trabajar en nuestras bases de datos.
      
Otra función útil es date(), que se utiliza para, a partir de un instante UNIX, sacar una fecha formateada. Esta función admite dos argumentos, el primero es una cadena de formato para la fecha, y el segundo, que es opcional, es el instante UNIX desde el que formatearla. Si no se especifica este segundo argumento, se toma el instante actual (equivalente a time()). En nuestra clase, encapsularemos una serie de constantes de formatos de fecha, y crearemos un método estático que nos devuelva la fecha de hoy formateada de distintas formas.
   
   
<?php
define ("SPANISH_DATE", "d-m-Y");
define ("UK_DATE", "m-d-Y");
define ("FULL_SPANISH_DATE", SPANISH_DATE." H:i:s");
define ("FULL_UK_DATE", UK_DATE." H:i:s");

public static function makeReadableTime($timeFormat, $unixtime = 0)
{
   $unixtime = ($unixtime == 0) ? time() : $unixtime;
   return date($timeFormat, $unixtime); 
}
?>