Leccion 60 de 75 12 min de lectura

Fechas y Tiempo en PHP

Trabajar con fechas es esencial en casi cualquier aplicacion. PHP ofrece la clase DateTime y funciones para formatear, comparar y calcular fechas facilmente.

Obtener fecha y hora actual

La funcion date() formatea la fecha actual segun el patron que indiques:

PHP
<?php

declare(strict_types=1);

// Fecha actual
echo date('Y-m-d');       // 2024-12-15
echo date('d/m/Y');       // 15/12/2024

// Hora actual
echo date('H:i:s');       // 14:30:45
echo date('H:i');         // 14:30

// Fecha y hora completa
echo date('Y-m-d H:i:s'); // 2024-12-15 14:30:45

// Dia de la semana
echo date('l');           // Sunday
echo date('D');           // Sun

Formatos comunes

PHP
<?php

declare(strict_types=1);

// Caracteres de formato mas usados:
// Y - Año (4 digitos): 2024
// m - Mes (01-12)
// d - Dia (01-31)
// H - Hora 24h (00-23)
// i - Minutos (00-59)
// s - Segundos (00-59)
// l - Nombre del dia (Monday, Tuesday...)
// F - Nombre del mes (January, February...)
// j - Dia sin cero (1-31)
// n - Mes sin cero (1-12)

echo date('j de F, Y');   // 15 de December, 2024
echo date('d-m-Y H:i');   // 15-12-2024 14:30

La clase DateTime

DateTime es la forma moderna de trabajar con fechas en PHP. Es mas flexible y potente que date():

PHP
<?php

declare(strict_types=1);

// Fecha actual
$ahora = new DateTime();
echo $ahora->format('Y-m-d H:i:s');

// Fecha especifica
$fecha = new DateTime('2024-06-15');
echo $fecha->format('d/m/Y'); // 15/06/2024

// Desde texto legible
$manana = new DateTime('tomorrow');
$proximoLunes = new DateTime('next Monday');
$haceUnaSemana = new DateTime('-1 week');

echo $manana->format('Y-m-d');
echo $proximoLunes->format('Y-m-d');
echo $haceUnaSemana->format('Y-m-d');

Modificar fechas

PHP
<?php

declare(strict_types=1);

$fecha = new DateTime('2024-01-15');

// Añadir tiempo
$fecha->modify('+1 day');
echo $fecha->format('Y-m-d'); // 2024-01-16

$fecha->modify('+2 weeks');
echo $fecha->format('Y-m-d'); // 2024-01-30

$fecha->modify('+3 months');
echo $fecha->format('Y-m-d'); // 2024-04-30

// Restar tiempo
$fecha->modify('-1 year');
echo $fecha->format('Y-m-d'); // 2023-04-30

// Con DateInterval (mas preciso)
$fecha = new DateTime('2024-01-15');
$fecha->add(new DateInterval('P10D')); // +10 dias
echo $fecha->format('Y-m-d'); // 2024-01-25

Calcular diferencias

PHP
<?php

declare(strict_types=1);

$inicio = new DateTime('2024-01-01');
$fin = new DateTime('2024-12-31');

$diferencia = $inicio->diff($fin);

echo $diferencia->days;   // 365 (dias totales)
echo $diferencia->y;      // 0 (años)
echo $diferencia->m;      // 11 (meses)
echo $diferencia->d;      // 30 (dias)

// Formato legible
echo $diferencia->format('%y años, %m meses, %d dias');
// 0 años, 11 meses, 30 dias

// Ejemplo practico: edad
$nacimiento = new DateTime('1995-06-20');
$hoy = new DateTime();
$edad = $nacimiento->diff($hoy);

echo "Tienes {$edad->y} años";

Comparar fechas

PHP
<?php

declare(strict_types=1);

$fecha1 = new DateTime('2024-06-15');
$fecha2 = new DateTime('2024-12-25');
$hoy = new DateTime();

// Comparacion directa
if ($fecha1 < $fecha2) {
    echo 'fecha1 es anterior a fecha2';
}

if ($fecha2 > $hoy) {
    echo 'fecha2 esta en el futuro';
}

if ($fecha1 == $fecha2) {
    echo 'Son la misma fecha';
}

// Verificar si una fecha ya paso
$evento = new DateTime('2024-03-15');
if ($evento < $hoy) {
    echo 'El evento ya paso';
} else {
    echo 'El evento aun no ha ocurrido';
}

Zona horaria

PHP
<?php

declare(strict_types=1);

// Establecer zona horaria por defecto
date_default_timezone_set('Europe/Madrid');

// Crear fecha con zona horaria especifica
$madrid = new DateTime('now', new DateTimeZone('Europe/Madrid'));
$tokyo = new DateTime('now', new DateTimeZone('Asia/Tokyo'));
$newYork = new DateTime('now', new DateTimeZone('America/New_York'));

echo 'Madrid: ' . $madrid->format('H:i') . PHP_EOL;
echo 'Tokyo: ' . $tokyo->format('H:i') . PHP_EOL;
echo 'New York: ' . $newYork->format('H:i') . PHP_EOL;

// Convertir entre zonas
$fecha = new DateTime('2024-06-15 10:00', new DateTimeZone('UTC'));
$fecha->setTimezone(new DateTimeZone('Europe/Madrid'));
echo $fecha->format('H:i'); // 12:00 (UTC+2 en verano)

Timestamps

Un timestamp es el numero de segundos desde el 1 de enero de 1970:

PHP
<?php

declare(strict_types=1);

// Timestamp actual
$timestamp = time();
echo $timestamp; // 1702654800

// Convertir timestamp a fecha
echo date('Y-m-d H:i:s', $timestamp);

// DateTime desde timestamp
$fecha = new DateTime();
$fecha->setTimestamp(1702654800);
echo $fecha->format('Y-m-d');

// Obtener timestamp de DateTime
$fecha = new DateTime('2024-06-15');
echo $fecha->getTimestamp();

Ejercicios

Ejercicio 1: Mostrar fecha formateada

Muestra la fecha actual en formato "15 de diciembre de 2024".

Ver solucion
PHP
<?php

declare(strict_types=1);

$meses = [
    1 => 'enero', 2 => 'febrero', 3 => 'marzo',
    4 => 'abril', 5 => 'mayo', 6 => 'junio',
    7 => 'julio', 8 => 'agosto', 9 => 'septiembre',
    10 => 'octubre', 11 => 'noviembre', 12 => 'diciembre'
];

$dia = date('j');
$mes = $meses[(int)date('n')];
$anio = date('Y');

echo "$dia de $mes de $anio";

Ejercicio 2: Calcular edad

Crea una funcion calcularEdad(string $fechaNacimiento): int que reciba una fecha en formato 'Y-m-d' y retorne la edad en años.

Ver solucion
PHP
<?php

declare(strict_types=1);

function calcularEdad(string $fechaNacimiento): int
{
    $nacimiento = new DateTime($fechaNacimiento);
    $hoy = new DateTime();
    $diferencia = $nacimiento->diff($hoy);

    return $diferencia->y;
}

echo calcularEdad('1995-06-20'); // Ej: 29

Ejercicio 3: Dias hasta evento

Crea una funcion diasHasta(string $fecha): int que calcule cuantos dias faltan hasta una fecha futura.

Ver solucion
PHP
<?php

declare(strict_types=1);

function diasHasta(string $fecha): int
{
    $objetivo = new DateTime($fecha);
    $hoy = new DateTime();
    $diferencia = $hoy->diff($objetivo);

    return $diferencia->days;
}

echo diasHasta('2024-12-25'); // Dias hasta Navidad

¿Te está gustando el curso?

Tenemos cursos premium con proyectos reales y soporte personalizado.

Descubrir cursos premium