Data menos 1 ano?

91

Eu tenho uma data neste formato:

2009-01-01

Como faço para devolver a mesma data, mas 1 ano antes?

ajsie
fonte
3
Não se esqueça de cuidar da questão semântica do que você entende por "um ano" em vez de anos bissextos. Subtraindo 365 dias de 28/02/2008 resultará em 28/02/2007, enquanto subtraindo 365 dias de 29/02/2008 resultará em 31/03/2007.
HostileFork diz não confie em SE
Eu acho que depende muito do que significa "subtrair um ano". Você poderia significar o mesmo mês e dia, mas um ano antes ou o mês e dia após a subtração de 365 dias, conforme Hostile aponta.
D.Shawley

Respostas:

130

Você pode usar strtotime:

$date = strtotime('2010-01-01 -1 year');

A strtotimefunção retorna um carimbo de data / hora Unix, para obter uma string formatada que você pode usar date:

echo date('Y-m-d', $date); // echoes '2009-01-01'
Christian C. Salvadó
fonte
99

Use a função strtotime ():

  $time = strtotime("-1 year", time());
  $date = date("Y-m-d", $time);
Alex
fonte
51

Usando o objeto DateTime ...

$time = new DateTime('2099-01-01');
$newtime = $time->modify('-1 year')->format('Y-m-d');

Ou usando agora por hoje

$time = new DateTime('now');
$newtime = $time->modify('-1 year')->format('Y-m-d');
darrenwh
fonte
31

uma maneira mais fácil que usei e funcionei bem

date('Y-m-d', strtotime('-1 year'));

funcionou perfeitamente .. espero que isso ajude outra pessoa também .. :)

saadk
fonte
9
// set your date here
$mydate = "2009-01-01";

/* strtotime accepts two parameters.
The first parameter tells what it should compute.
The second parameter defines what source date it should use. */
$lastyear = strtotime("-1 year", strtotime($mydate));

// format and display the computed date
echo date("Y-m-d", $lastyear);
Nirmal
fonte
6

No meu site, para verificar se o cadastro de pessoas tem 18 anos , usei simplesmente o seguinte:

$legalAge = date('Y-m-d', strtotime('-18 year'));

Depois, compare apenas as duas datas.

Espero que possa ajudar alguém.

Meloman
fonte
2

Embora existam muitas respostas aceitáveis ​​em resposta a esta pergunta, não vejo nenhum exemplo do submétodo usando o \Datetimeobjeto: https://www.php.net/manual/en/datetime.sub.php

Portanto, para referência, você também pode usar um \DateIntervalpara modificar um \Datetimeobjeto:

$date = new \DateTime('2009-01-01');
$date->sub(new \DateInterval('P1Y'));

echo $date->format('Y-m-d');

Que retorna:

2008-01-01

Para obter mais informações sobre \DateInterval, consulte a documentação: https://www.php.net/manual/en/class.dateinterval.php

Oliver Tappin
fonte
-3

Você pode usar a seguinte função para subtrair 1 ou quaisquer anos de uma data.

 function yearstodate($years) {

        $now = date("Y-m-d");
        $now = explode('-', $now);
        $year = $now[0];
        $month   = $now[1];
        $day  = $now[2];
        $converted_year = $year - $years;
        echo $now = $converted_year."-".$month."-".$day;

    }

$number_to_subtract = "1";
echo yearstodate($number_to_subtract);

E olhando para os exemplos acima, você também pode usar o seguinte

$user_age_min = "-"."1";
echo date('Y-m-d', strtotime($user_age_min.'year'));

fonte