Crear y convertir fechas en PHP

  • Por
Cómo usar la clase DateTime para crear y convertir fechas en PHP, crear cadenas de fecha en cualquier formato o convertirlas desde un formato a otro.

En la medida que el lenguaje PHP avanza también se crean soluciones más potentes y sofisticadas para el trabajo con elementos habituales de las aplicaciones web. como las fechas, objetivo de este taller.

El objetivo que queremos resolver en este artículo es principalmente el de convertir cualquier cadena de fecha en PHP de un formato a otro. No interesa qué formato de origen tenemos y tampoco qué formato de salida necesitamos, la solución que vamos a aportar sirve para todos los tipos de fechas que podamos necesitar en algún momento.

Para ello vamos a usar una clase de PHP llamada DateTime que tenemos disponible a partir de PHP 5.3, pero no te preocupes si usas PHP orientado a procedimientos, porque explicaremos ambos estilos de codificación.

En resumen, a través de una cadena de fecha, en cualquier formato, podremos construir un objeto DateTime de una manera sencilla y a partir de ese objeto podremos generar cadenas de fecha escritas en cualquier otro formato de salida. Por ejemplo, podremos convertir una fecha de MySQL al formato habitual usado en el español, o viceversa. También una fecha en inglés a formato MySQL o a español. Las combinaciones serán las que necesites y el mecanismo de trabajo realmente sencillo y menos rebuscado que soluciones anteriores que ya habíamos presentado en DesarrolloWeb.com en artículos anteriores.

Crear el objeto DateTime a partir de cualquier cadena de origen

Como punto de partida tenemos una cadena (string) con una fecha y lo que queremos conseguir es un objeto DateTime, un paso intermedio que nos facilitará luego generar cadenas de fechas en cualquier otro formato.

$cadena_fecha_mysql = "2015-08-24";

Nota: Como decíamos, esa cadena podrá estar en cualquier formato. Inicialmente para nuestro ejemplo tenemos una cadena que tiene la codificación de los campos de tipo "date" en las tablas de MySQL, pero podría ser cualquier otro formato de entrada.

Ahora, a partir de esa cadena, vamos a generar un objeto de clase DateTime. Esa clase es muy potente y la podemos usar para varias cosas relacionadas con fechas. Si quieres puedes ver un resumen de la documentación de la clase DateTime en la página de php.net. http://php.net/manual/es/class.datetime.php

// Estilo por procedimientos
$objeto_DateTime = date_create_from_format('Y-m-d', $cadena_fecha_mysql);

Si estás familiarizado con la programación orientada a objetos podrás preferir el estilo de codificación por objetos.

// Estilo por objetos
$objeto_DateTime = DateTime::createFromFormat('Y-m-d', $cadena_fecha_mysql);

Nota: Las dos líneas devuelven la misma cosa, el objeto DateTime, así que usarás una u otra dependiendo de tus preferencias de codificación.

Observa que para la creación de este objeto usamos una función o método que recibe dos parámetros:

  1. El formato de origen en el que está escrita nuestra fecha inicial
  2. La cadena o string con la fecha en dicho formato de origen

Crear una cadena de fecha en cualquier formato de salida

A partir de nuestro objeto DateTime podemos hacer varias cosas, gracias a los variados métodos disponibles en la clase. Nosotros queremos ahora hacer algo tan simple como generar una cadena con la misma fecha en el formato que necesitemos. Para ello está el método format() o si lo prefieres la función date_format() que hace la misma cosa pero con codificación procedimental.

Comenzamos presentando el código de la función simple.

// Estilo por procedimientos
$cadena_nuevo_formato = date_format($objeto_DateTime, "d/m/Y");

Esa es la cadena resultante de nuestro ejemplo y la hemos generado con el formato típico del idioma español, dia/mes/año, pero podría haber sido cualquier formato de salida cambiando el segundo parámetro.

Si lo prefieres, esto se puede hacer directamente con estilo de orientación a objetos, ya que nuestro $objeto_DateTime es un objeto en toda regla.

// Estilo por objetos $cadena_nuevo_formato = $objeto_DateTime->format("d/m/Y");

Ya solo te quedaría usar la $cadena_nuevo_formato en el lugar donde la necesites. Pero observa antes esta función / método y su parámetro.

format("d/m/y")
date_format($objeto_DateTime, "d/m/Y");

La cadena "d/m/Y" es el formato de salida. No lo hemos dicho, pero ese formato lo puedes construir con las mismas reglas que usas en la función date() de PHP de toda la vida.

Crear una fecha en cualquier formato usando el instante actual

Ya que hemos aprendido algo sobre la clase DateTime, vamos a usarla para crear una fecha con el instante actual, sobre la que luego podemos aplicar el formato que queramos para construir una cadena fecha.

// Con objetos
$fecha_actual = new DateTime();
$cadena_fecha_actual = $fecha_actual->format("d/m/Y");

Como ves, podrías generar primero un objeto DateTime con el constructor vacío de parámetros. Luego aplicas el método format para generar la cadena con tu formato.

Si ya conoces la función date(), del PHP de siempre, te habrás dado cuenta que esto mismo se puede hacer más rápido simplemente así:

$cadena_fecha_actual = date("d/m/Y");

Sin embargo, con el estilo nuevo y gracias a la clase DateTime tienes una serie de métodos y funciones asociados directamente al objeto DateTime generado, con los que poder hacer otras cosas.

Veamos para completar el estilo de procedimientos, generando ahora otro formato en la cadena de salida, que también incluye la hora actual.

$date = date_create();
$cadena_fecha_actual = date_format($date, 'Y-m-d H:i:s');

Eso es todo. Estamos seguros que este nuevo mecanismo para trabajar con fechas será de mucha utilidad para vosotros.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

alfonzodiez

28/9/2015
Buen Articulo
Muy buen articulo, recomiendo personalmente el uso de la librería nesbot/carbon, hace muy fácil la manipulación de fechas.

Renata

25/8/2016
Fechas en PHP
Estaba justamente buscando esta información. En 5 minutos todas mis dudas resueltas en cuanto al tratamiento de fechas. Agradecimientos!