Para trabajar con fechas en php tenemos varias opciones, desde usar la función date a trabajar con timestamp. En este artículo vamos usar el objeto DateTime por la potencia que ofrece. Y para agregarle funcionalidades vamos agregar la librería Carbon.

La clase DateTime

La clase nativa que PHP nos proporciona para trabar con fechas.

Obtener la fecha actual

$fecha = new DateTime();

Ahora $fecha contiene la fecha en la que se ejecuta el código, si hacemos var_dump a este objeto obtendremos algo como esto:

var_dump del objeto DateTime

El constructor de la clase acepta dos parámetros opcionales, el primero una fecha y el segundo un objeto DateTimeZone. Si no pasamos el primer parámetro como en el ejemplo anterior se recoge la fecha actual.

Trabajar con una fecha concreta

Tenemos una fecha guardada en base de datos que queremos transformar al objeto DateTime para trabajar con ella, lo que tenemos que hacer es pasarsela como string al constructor de la clase DateTime como primer parámetro, por ejemplo:

$fecha = new DateTime('2008-08-07 18:11:31');

Ojo con esto, para que la fecha se inicie correctamente la fecha debe de estar en un formato especifico. Por ejemplo el formato que usamos en España «dia/mes/año» no nos sirve. Si creamos un objeto DateTime a partir de la fecha «01/02/2020» no vamos a crear el día uno de febrero de 2020, vamos a crear el día dos de Enero de 2020, esto es por que php espera la fecha en formato americano, mucho cuidado con esto. Puedes ver que formatos están admitidos en este enlace: https://www.php.net/manual/es/datetime.formats.php.

Yo recomiendo trabajar con el formato de MySQL por que es uno de los más extendidos y nos facilita el trabajo al usar esta base de datos. El formato de MySQL es «Año-mes-día hora:minuto:segundo» por ejemplo «2008-08-07 18:11:31».

Fechas con formato no admitido

¿Que pasa cuando queremos inicializar la clase DateTime a partir de una fecha con un formato que no admite el constructor o no es el que espera?

Vamos con el ejemplo anterior, tenemos la fecha «01/02/2020», si creamos un objeto DateTime como hemos dicho se va a crear el día dos de Enero de 2020, y queremos crear la fecha uno de Febrero de 2020 para esto tenemos que indicarle al objeto DateTime el formato en el que tenemos la fecha con su método estático createFromFormat, vamos a ver un ejemplo:

$fechaA = new DateTime('01/02/2020'); // Dos de Enero de 2020
$fechaB = DateTime::createFromFormat('d/m/Y', '01/02/2020'); // Uno de Febrero del 2020

De esta forma especificando el formato podemos iniciar cualquier fecha con el objeto DateTime, podemos ver como construir el formato en el siguiente enlace https://www.php.net/manual/es/datetime.createfromformat.php#refsect1-datetime.createfromformat-parameters

La librería Carbon

Carbon (https://carbon.nesbot.com/) es una extensión de la clase DateTime que nos aporta montón de funcionalidades extra para trabajar con fechas.

Instalación

Usamos composer para instalar carbon.

composer require nesbot/carbon

Como usamos esta librería

Carbon es una clase que extiende de la case nativa DateTime, por lo tanto la usamos de la misma forma que usamos el objeto DateTime.

<?php
require 'vendor/autoload.php';
use Carbon\Carbon;
$fecha = new Carbon();

La potencia de carbon

Carbon, añade al objeto DateTime múltiples métodos que agregan nuevas funcionalidades y facilitan otras. Podemos verlas en la documentación oficial https://carbon.nesbot.com/docs/

Algunos de los métodos que nos proporciona carbon:

$fecha->addMonth(); // Añade un mes a la fecha
$fecha->subMonth(); // Quita un mes a la fecha
$fecha->startOfYear(); // Setea la fecha al primer día del año con tiempo 00:00:00
$fecha->endOfDay(); // Setea la fecha último día del año con tiempo 23:59:59.999999
$fecha->diffForHumans($fecha2) // Devuelve la diferencia de dos fechas en texto por ejemplo "2 segundos antes" (para que el texto este en castellano hay que especificar la localización $fecha->locale('es');)

Aún más potencia

Si creamos una nueva clase que llamemos por ejemplo Fecha y la extendemos de Carbon tendremos toda la potencia de carbon con el objeto nativo DateTime y nuestros métodos personalizados, todo en la misma clase:

<?php

use Carbon\Carbon;

class Fecha extends Carbon
{
    function miMetodoPersonalizado() {
        
    }
}