Manejo de fechas en PHP

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail

Abrimos esta serie de artículos de “Trucos y Recursos para PHP” con un tema delicado de gestionar, no sólo en este lenguaje en particular, sino en cualquier otro. De hecho, PHP es uno de los lenguajes en el que las fechas son más manejables, ya que implementa funcionalidades muy específicas y bien concebidas. Los datos de tipo fecha, y las operaciones que se pueden necesitar sobre ellos son, sin duda, una pequeña “bete noire” para muchos programadores. Desde aquí voy a transmitiros mi experiencia con estos datos, en el deseo de que os ahorre algún dolorcillo de cocorota.

Las fechas son datos incómodos de manejar porque no se ciñen a un patrón estricto sobre el que se puedan, sin más, aplicar operaciones aritméticas simples. Dividimos el tiempo en años, y estos, a su vez, en doce meses. La cosa podría ser más simple, si los años tuvieran diez meses, ya que diez es la base de numeración con la que estamos acostumbrados a trabajar. Y creo que hubo una época en que era así, que es lo natural para nosotros. Desafortunadamente, no se que emperador romano, en la época en que todo el mundo conocido era provincia de Roma, añadió dos meses más, por cuestiones esotéricas, o religiosas, o astrológicas, o porque había ingerido demasiado vino, vete a saber. El caso es que nos la lió bien con los meses. Y la cosa no acaba ahí. Los meses no tienen todos los mismos días, ni siguen un patrón regular. Ni siquiera los años tienen siempre los mismos días… Uffff. Una verdadera pesadilla.

Una cosa importante que los programadores de PHP debemos tener presente, es que las fechas se almacenan, cuando usamos bases de datos SQL (como, pe. MySQL), en formato aaaa-mm-dd y que, por extraño que suene a los neófitos, esta es una forma muy “natural”, a falta de otra palabra mejor, y la más adecuada para trabajar con fechas. Afortunadamente, la función date() de PHP nos permite luego reconvertir el formato al que necesitemos para renderizar datos en pantalla (en España y otros paises, dd-mm-aaaa; en culturas anglosajonas, mm-dd-aaaa, etc.).

SUMAR O RESTAR UN LAPSO A UNA FECHA

Esta es una operación que hay que realizar con mucha frecuencia. Ya sea que tienes que calcular la fecha de caducidad de un producto alimenticio, en base a la fecha de preparación y la duración estimada por el fabricante, o la próxima fecha de renovación del carnet de los miembros de una asociación privada, es necesario sumar determinada cantidad de días, meses o años a una fecha, que puede ser de emisión, de envasado, etc.

Esta es, en realidad, una operación muy simple, si se conoce un pequeño “extra” que incluye la función date. Para verlo, vamos a partir de una fecha de origen y le vamos a sumar y restar distintos periodos, viendo el resultado. El código que hemos usado para probar esto es el siguiente:

El resultado que obtenemos en el navegador es el siguiente:

Fecha original: 2016-07-31
Fecha original en formato español: 31-07-2016
Fecha menos tres días: 28-07-2016
Fecha más ocho días: 08-08-2016
Fecha menos seis semanas: 19-06-2016
Fecha más cuatro semanas: 28-08-2016
Fecha menos diez meses: 01-10-2015
Fecha más veinticuatro meses: 31-07-2018
Fecha menos cinco años: 31-07-2011
Fecha más siete años: 31-07-2023

Cómo ves, más fácil y rápido, imposible. Pero esto no es todo. Con este recurso se puede afinar mucho más, trabajando sobre una fecha completa, incluyendo horas, minutos y segundos. Observa el siguiente script:

Y el resultado en el navegador es el siguiente:

Fecha original: 2016-07-31 20:30:18
Fecha original en formato español: 31-07-2016 20:30:18
Fecha menos veintitres horas: 30-07-2016 21:30:18
Fecha más cinco horas: 01-08-2016 01:30:18
Fecha menos seis minutos: 31-07-2016 20:24:18
Fecha más diecisiete minutos: 31-07-2016 20:47:18
Fecha menos cuarenta segundos: 31-07-2016 20:29:38
Fecha más ocho segundos: 31-07-2016 20:30:26

Y eso no es todo. Puedes, incluso, combinar la suma o resta de varias unidades de medida del tiempo, así:

El resultado es sorprendentemente exacto, como puedes ver.

Fecha original: 2016-07-31 20:30:18
Fecha original en formato español: 31-07-2016 20:30:18
Fecha más diez días y cuatro horas: 11-08-2016 00:30:18

LA DIFERENCIA ENTRE FECHAS

En ocasiones necesitamos calcular la diferencia en días, horas, o cualquier otra unidad de medida de tiempo entre dos momentos concretos. Por ejemplo, es muy habitual tener un sistema de fichajes para el control de entrada y salida de personal en una fábrica, taller, oficina, etc. Se graba la fecha y hora de entrada y de salida, que puede ser en la misma fecha que la entrada, o al día siguiente (en turnos de noche, por ejemplo). A final de mes, hay que contabilizar las horas trabajadas por cada miembro del personal, para el cálculo de nóminas, horas extras, etc.

Calcular la diferencia entre fechas es un proceso relativamente simple de llevar a cabo con PHP. Observa el siguiente script:

Veamos lo que hacemos. En primer lugar tenemos dos momentos de tiempo, con fecha y hora, en formato normal de cadena, tal cómo los tendríamos si, por ejemplo, estos datos procedieran de una base de datos.

$primeraFecha = "2016-07-31 20:30:18";
$segundaFecha = "2016-08-21 07:30:26";

La función date_diff() puede obtener la diferencia entre dos momentos de tiempo, pero no puede operar con cadenas. Los datos que tenemos deben ser convertidos a objetos de la clase DateTime, mediante el uso de la función date_create(), tal como vemos en la siguente línea:

$diferencia = date_diff(date_create($primeraFecha), date_create($segundaFecha));

Esto crea un objeto con una serie de datos que especifica la diferencia entre ambas fechas, en años, meses, días, horas, minutos y segundos, tal como podemos ver en la salida del script listado encima de estas líneas.

Primera fecha: 2016-07-31 20:30:18
Segunda fecha: 2016-08-21 07:30:26
Primera fecha en formato español: 31-07-2016 20:30:18
Segunda fecha en formato español: 21-08-2016 07:30:26
Diferencia:

Podemos hacer dos cosas. Empleamos los elementos que nos interesen, ya que este objeto lo podemos procesar como una matriz asociativa. En ese caso, a partir de los valores almacenados en las primeras seis claves podemos calcular la diferencia en la unidad de medida que nos interese.

Sin embargo, debemos saber que los objetos de la clase DateTime cuentan con el método format(), que nos permite sacar la salida en un formato específico, por ejemplo, para informes visuales. Observa la siguiente versión del script anterior:

Cómo ves, lo que hacemos es usar el método format() de la clase DateTime para aplicar una secuencia de patrones, para que la salida se adapte a ellos. En el ejemplo, la salida que vemos es la siguiente:

Primera fecha: 2016-07-31 20:30:18
Segunda fecha: 2016-08-21 07:30:26
Primera fecha en formato español: 31-07-2016 20:30:18
Segunda fecha en formato español: 21-08-2016 07:30:26
Diferencia: 00-00-20 11:00:08

El método format puede usar los códigos de formateado de datos de fecha que se usan en la función date() de PHP (precedidos, siempre, del símbolo %, cómo vemos en el código).

Espero que este microartículo te resulte útil a la hora de enfrentarte con fechas en PHP.

     

Un comentario:

  1. Pingback: PHP-TUT-12 Manejo de datos (y II) » Recursos para programadores

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *