PHP, la manera correcta

5.1. Fecha y Hora

PHP dispone de una clase llamada DateTime que facilita la lectura, escritura, comparación y cálculos sobre fehcas y horas. Aunque existen muchas funciones en PHP relacionadas con la manipulación de la fecha y la hora, la clase DateTime ofrece una interfaz orientada a objetos que es mucho mejor en la mayoría de casos. También permite trabajar con los diferentes husos horarios, aunque en esta sección no profundizaremos en ello.

Para comenzar a trabajar con DateTime, lo primero que puedes hacer es convertir una cadena de texto en un objeto de fecha y hora gracias al método createFromFormat(). Si lo prefieres, también puedes crear un objeto con la fecha y horas actuales mediante new \DateTime. Después, utiliza el método format() para convertir el objeto DateTime en una cadena de texto para poder mostrar la fecha y hora a tus usuarios:

<?php
$fecha = '22. 11. 1968';
$inicio = \DateTime::createFromFormat('d. m. Y', $fecha);

echo "Fecha de Inicio: " . $inicio->format('m/d/Y') . "\n";

Por otra parte, puedes utilizar la clase DateInterval para realizar cálculos con fechas y horas. La clase DateTime tiene métodos como add() y sub() que requieren pasar un argumento de tipo DateInterval. Nunca escribas código que considere que todos los días del año tienen el mismo número de segundos, ya que los ajustes de los husos horarios y el horario de verano (daylight savings time) hacen que esto no sea cierto. En su lugar, utiliza los intervalos de fechas para hacer los cálculos. Así por ejemplo, para calcular la diferencia entre fechas debes utilizar el método diff(). El resultado de este método es un return new DateInterval, por lo que puedes imprimir fácilmente la información por pantalla.

<?php
// Crea una copia de $inicio y añade un mes y 6 días
$final = clone $inicio;
$final->add(new \DateInterval('P1M6D'));

$diff = $final->diff($inicio);
echo "Diferencia: " . $diff->format('%m mes, %d días (total: %a días)') . "\n";
// Diferencia: 1 mes, 6 días (total: 37 días)

También es posible comparar fácilmente los objetos DateTime:

<?php
if($inicio < $final) {
    echo "¡El inicio sucede antes que el final!\n";
}

El siguiente ejemplo muestra cómo se utiliza la clase DatePeriod para iterar sobre eventos periódicos. El objeto toma dos objetos DateTime, uno para el inicio y el otro para el final, y el intervalo que define el número de eventos periódicos que se devuelven.

<?php
// Imprimir todos los jueves entre $inicio y $final
$intervalo = \DateInterval::createFromDateString('first thursday');
$periodo = new \DatePeriod($inicio, $intervalo, $final, \DatePeriod::EXCLUDE_START_DATE);

foreach($periodo as $fecha)
{
    // Imprimir cada fecha en el periodo
    echo $fecha->format('m/d/Y') . " ";
}