Como para 31 de Enero + 1 mes dará como resultado 2 de Marzo (año bisiesto) o
3 de Marzo (año normal).
<?php
echo "Año normal:\n"; // febrero tiene 28 días
$dt = new DateTimeImmutable("2015-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Inicio: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+1 month");
echo "Fin: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
echo "Año bisiesto:\n"; // febrero tiene 29 días
$dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Inicio: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+1 month");
echo "Fin: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
El ejemplo anterior mostrará:
Año normal:
Inicio:2015-01-31 00:00:00 -05:00
Fin:2015-03-03 00:00:00 -05:00
Año bisiesto:
Inicio:2016-01-31 00:00:00 -05:00
Fin:2016-03-02 00:00:00 -05:00
Para obtener el último día del mes próximo (es decir, para prever el
excedente), el formato last day of está disponible.
<?php
echo "Año normal:\n"; // febrero tiene 28 días
$dt = new DateTimeImmutable("2015-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Inicio: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("last day of next month");
echo "Fin: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
echo "Año bisiesto:\n"; // febrero tiene 29 días
$dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Inicio: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("last day of next month");
echo "Fin: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
El ejemplo anterior mostrará:
Año normal:
Inicio:2015-01-31 00:00:00 -05:00
Fin:2015-02-28 00:00:00 -05:00
Año bisiesto:
Inicio:2016-01-31 00:00:00 -05:00
Fin:2016-02-29 00:00:00 -05:00