¿Fecha menos 1 año?

91

Tengo una fecha en este formato:

2009-01-01

¿Cómo devuelvo la misma fecha pero 1 año antes?

ajsie
fuente
3
No olvide ocuparse de la cuestión semántica de lo que quiere decir con "un año" con años bisiestos. Restar 365 días de 2008-02-28 le dará 2007-02-28, mientras que restar 365 días de 2008-02-29 le dará 2007-03-31.
HostileFork dice que no confíes en SE
Supongo que depende mucho de lo que signifique "restar un año". Podría referirse al mismo mes y día pero un año antes o el mes y día después de restar 365 días como señala Hostile.
D.Shawley

Respuestas:

130

Puede utilizar strtotime:

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

La strtotimefunción devuelve una marca de tiempo de Unix, para obtener una cadena formateada que puede usar date:

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

Utilice la función strtotime ():

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

Usando el objeto DateTime ...

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

O usar ahora por hoy

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

una forma más fácil que usé y funcionó bien

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

esto funcionó perfecto .. espero que esto ayude a alguien más también .. :)

saadk
fuente
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
fuente
6

En mi sitio web, para comprobar si el registro de personas tiene 18 años , simplemente utilicé lo siguiente:

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

Después, solo compare las dos fechas.

Espero que pueda ayudar a alguien.

Meloman
fuente
2

Aunque hay muchas respuestas aceptables en respuesta a esta pregunta, no veo ningún ejemplo del submétodo que usa el \Datetimeobjeto: https://www.php.net/manual/en/datetime.sub.php

Entonces, como referencia, también puede usar a \DateIntervalpara modificar un \Datetimeobjeto:

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

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

Que devuelve:

2008-01-01

Para obtener más información sobre \DateInterval, consulte la documentación: https://www.php.net/manual/en/class.dateinterval.php

Oliver Tappin
fuente
-3

Puede utilizar la siguiente función para restar 1 o cualquier año de una fecha.

 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);

Y mirando los ejemplos anteriores, también puede usar lo siguiente

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

fuente