Trabalhando com datas no PHP: adicionando ou subtraindo dias/meses/anos a uma determinada data

Trabalhando com datas no PHP: adicionando ou subtraindo dias/meses/anos a uma determinada data
4.0 1

Trabalhar com datas é uma das coisas mais simples que o PHP tem. Mesmo assim vejo essa dúvida de forma frequente nos fóruns em que participo, para resolver isto e conseguir responder de forma mais rápida quando a dúvida surgir vou compilar alguns exemplos e deixar os links da melhor fonte de consultas, ou seja, o manual.

Primeiro, vamos começar com o tradicional strtotime . O motivo disto é simples, se você conseguir utilizar essa função, independente da versão do PHP você não terá problemas.

Vamos começar do básico, strtotime significa basicamente STRing TO TIME, ou seja, você irá transformar a string da data em um timestamp.

<?php
$data = strtotime('2016-05-19');
echo $data; //Saída: 1463626800
?>

Agora vamos pensar, eu quero adcionar 5 dias a data de hoje (independente de qual seja), então:
<?php
$data_futura = date('Y-m-d',strtotime('+5 days'));
echo $data_futura; //Saída: 2016-05-25. Lembrando que estou escrevendo isto dia 20/05/2016.
?>

O primeiro ponto de dúvida, como adiciono/removo dias de uma determinada data que não seja hoje. A resposta é simples, basta informar o timestamp da data! strtotime permite 2 argumentos, o primeiro será uma string de data/hora. O segundo será o timestamp a ser utilizado, se você não informar o segundo ele simplesmente usa o timestamp atual (igual no exemplo anterior). Então vamos dizer que eu queira adicionar 5 dias à data 19/05/2016:
<?php
$data = strtotime('2016-05-19');
$data_futura = date('Y-m-d',strtotime('+5 days', $data));
echo $data_futura; //Saída: 2016-05-24. Lembrando que a data que o sistema tomou como base foi 19/05/2016.
?>


Acho que isto resolve 99% das dúvidas, por óbvio se você desejar deminuir 5 dias, basta trocar o "+" por "-". Vale ressaltar que existe uma miríade de opções que estão disponíveis no manual , exemplos:

Primeiro dia do mês:
<?php
$data = strtotime('2016-05-19');
$data_futura = date('Y-m-d',strtotime('first day of this month', $data));
echo $data_futura; //Saída: 2016-05-01. Lembrando que a data que o sistema tomou como base foi 19/05/2016.
?>

Último dia do mês:
<?php
$data = strtotime('2016-05-19');
$data_futura = date('Y-m-d',strtotime('last day of this month', $data));
echo $data_futura; //Saída: 2016-05-31. Lembrando que a data que o sistema tomou como base foi 19/05/2016.
?>

Último dia do próximo mês
<?php
$data = strtotime('2016-05-19');
$data_futura = date('Y-m-d',strtotime('last day of next month', $data));
echo $data_futura; //Saída: 2016-06-30. Lembrando que a data que o sistema tomou como base foi 19/05/2016.
?>

É possível trabalhar uma infinidade de combinações, basicamente elas estão explicadas no link que passei acima.

Agora vamos a "opção 2", o único pré-requisito é ter disponível o PHP 5.3.0. A partir desta versão do PHP você terá acesso a classe DateTime , com ela você poderá fazer tudo que já foi mostrado e outras coisas. Por exemplo, adicionando 5 dias a uma data determinada:
<?php
$data = '2016-05-19';
$data_futura = new DateTime($data);
echo $data_futura->modify('+5 day')->format('Y-m-d'); //Saída: 2016-05-24. Lembrando que a data que o sistema tomou como base foi 19/05/2016.
?>

Adicionando 5 dias a data atual:
<?php
$data_futura = new DateTime();
echo $data_futura->modify('+5 day')->format('Y-m-d'); //Saída: 2016-05-25. Lembrando que estou escrevendo isto dia 20/05/2016.
?>

Último dia do mês
<?php
$data = '2016-05-19';
$data_futura = new DateTime($data);
echo $data_futura->modify('last day of this month')->format('Y-m-d'); //Saída: 2016-05-31. Lembrando que a data que o sistema tomou como base foi 19/05/2016.
?>

Apenas vou colocar uma consideração, eu sei que existe o add /sub . Neste exemplo em específico preferi usar apenas o midify, pois com ele é possível usar os mesmos parâmetros passados para strotime, o objetivo aqui é apenas dar uma solução simples e direta para quem precisa, sem enrolação e firula.

Apenas a título de curiosidade, como ficaria adicionar 5 dias a uma data determinada usando o add com DateInterval.
<?php
$data = '2016-05-19';
$data_futura = new DateTime($data);
$data_futura->add(new DateInterval('P5D')); // 5D singnfica 5 days.
echo $data_futura->format('Y-m-d'); //Saída: 2016-05-24. Lembrando que a data que o sistema tomou como base foi 19/05/2016.
?>

Comente =)

Atenção: Todos os comentários são moderados, por isto não perca seu tempo postando bobagens ou spam.