Como em 31 de janeiro + 1 mês, irá resultar em 2 de março (em ano bissexto) ou
3 de março (em ano normal).
<?php
echo "Ano normal:\n"; // fevereiro tem 28 dias
$dt = new DateTimeImmutable("2015-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Início: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+1 month");
echo "Fim: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
echo "Ano bissexto:\n"; // fevereiro tem 29 dias
$dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Início: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+1 month");
echo "Fim: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
?>
O exemplo acima produzirá:
Ano normal:
Início: 2015-01-31 00:00:00 -05:00
Fim: 2015-03-03 00:00:00 -05:00
Ano bissexto:
Início: 2016-01-31 00:00:00 -05:00
Fim: 2016-03-02 00:00:00 -05:00
PAra obter o último dia do mês seguinte (para evitar a transferência),
o formato last day of
está disponível.
<?php
echo "Ano normal:\n"; // fevereiro tem 28 dias
$dt = new DateTimeImmutable("2015-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Início: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("last day of next month");
echo "Fim: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
echo "Ano bissexto:\n"; // fevereiro tem 29 dias
$dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Início: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("last day of next month");
echo "Fim: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
?>
O exemplo acima produzirá:
Normal year:
Start: 2015-01-31 00:00:00 -05:00
End: 2015-02-28 00:00:00 -05:00
Leap year:
Start: 2016-01-31 00:00:00 -05:00
End: 2016-02-29 00:00:00 -05:00