PHP DateTime y DateInterval

Vamos a ver algunas propiedades del objeto DateTime para manejar fechas y horas y del objeto DateInterval que se usa para algunas propiedades.

El objeto DateTime se instancia con la palabra clave new. Por defecto tendrá la fecha actual, pero podemos pasarle una cadena que nos indicará la fecha que queramos. Esta es similar a las que pasamos en strtotime y permite palabras como ‘tomorrow’, o ‘next month’:

$currentDateTime = new DateTime(); 
$yesterday = new DateTime('yesterday'); 
$twoDaysLater = new DateTime('+ 2 days'); 
$oneWeekEarly = new DateTime('- 1 week'); 
$dateTime = new DateTime('2015-01-01 12:30:12');

Otros ejemplos:

$valid_time_formats = ['now', 'jan 1 2016', '12 hours ago', 'next year', 'first day of next month', 'last day of this month', '12/25/2015', '@612835200'];

Una vez tenemos un objeto DateTime podemos formatearlo como se hacía con date():

$now = new DateTime();   
$ymdNow = $now->format('Y-m-d'); 
print_r($now->format('jS F Y'));   
print_r($now->format('ga jS M Y'));   
print_r($now->format('Y/m/d s:i:H'));

Podemos comparar dos fechas:

$today = new DateTime('today'); 
$yesterday = new DateTime('yesterday');  

var_dump($today > $yesterday); 
var_dump($today < $yesterday); 
var_dump($today == $yesterday);

// Output 
bool(true) 
bool(false) 
bool(false)

Podemos modificar una fecha con la propiedad modify, que permite añadir o quitar elementos igual que en strtotime:

$today = new DateTime('today');

$today->modify('-2 days');

Ejemplos de modificadores:

$modifiers = ['now', '+10 seconds', '+10 minutes', '+1 day', 'last second tomorrow', 'last day of this month', '12/31', '+3 months', '+1 year'];

Las fechas se pueden restar. Esto nos devuelve un objeto de tipo DateInterval, que veremos más adelante:

$today = new DateTime('today'); 
$yesterday = new DateTime('yesterday');  

$interval = $today->diff($yesterday);
echo $interval->format('%d day ago')

El formato de interval es parecido al de date, pero con el %.

También podemos añadir o restar intervalos a las fechas:

$today = new DateTime('today');
 
$today->add(new DateInterval('P2D'));
$today->sub(new DateInterval('P2D'));

El objeto DateInterval merece apartado propio. Se crea con una duración de un periodo determinado:

PYMDTHMS
P: period
Y: years
M: months
D: days
T: time
H: hours
M: minutes
S: seconds

Ejemplos:

P1Y 1 año
P1M 1 mes
P1D 1 día
P30D 30 días
PT1H 1 hora
PT5M 5 minutos
PT35S 35 segundos
P1Y6M29DT4H34M23S 1 año, 6 meses, 29 días, 4 horas, 34 minutos, 23 segundos

$Duration = new DateInterval( "P1Y2M3DT4H5M6S" );
print_r( $Duration );
Resultado:

DateInterval Object
(
[y] => 1
[m] => 2
[d] => 3
[h] => 4
[i] => 5
[s] => 6
...
)

$Duration = new DateInterval('P345D');
echo $Duration->format('P%yY%mM%dDT%hH%iM%sS'); // P0Y0M345DT0H0M0S

Algunos enlaces de utilidad:

https://www.startutorial.com/articles/view/master-php-datetime

http://www.bonify.io/blog/2014/09/its-about-time-we-talk-about-phps-datetime

http://php.net/manual/es/class.datetime.php

https://www.webpagefx.com/blog/web-design/php-dateinterval-class/

http://php.net/manual/es/class.dateinterval.php