Data minus 1 rok?

91

Mam datę w tym formacie:

2009-01-01

Jak zwrócić tę samą datę, ale rok wcześniej?

ajsie
źródło
3
Nie zapomnij zająć się semantycznym zagadnieniem, co masz na myśli przez „jeden rok” w odniesieniu do lat przestępnych. Odejmując 365 dni od 2008-02-28 otrzymasz 2007-02-28, a odejmując 365 dni od 2008-02-29 otrzymasz 2007-03-31.
HostileFork mówi, że nie ufaj SE
Myślę, że to w dużej mierze zależy od tego, co oznacza „odjęcie roku”. Możesz mieć na myśli ten sam miesiąc i dzień, ale rok wcześniej lub miesiąc i dzień po odjęciu 365 dni, jak wskazuje Wrogie.
D.Shawley,

Odpowiedzi:

132

Możesz użyć strtotime:

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

strtotimeZwraca znacznik czasu Uniksa, aby uzyskać sformatowany ciąg można użyć date:

echo date('Y-m-d', $date); // echoes '2009-01-01'
Christian C. Salvadó
źródło
101

Użyj funkcji strtotime ():

  $time = strtotime("-1 year", time());
  $date = date("Y-m-d", $time);
Alex
źródło
52

Korzystanie z obiektu DateTime ...

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

Lub używając teraz na dziś

$time = new DateTime('now');
$newtime = $time->modify('-1 year')->format('Y-m-d');
darrenwh
źródło
32

najłatwiejszy sposób, z którego korzystałem i działał dobrze

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

to zadziałało idealnie .. mam nadzieję, że to pomoże komuś innemu .. :)

saadk
źródło
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
źródło
6

Na mojej stronie, aby sprawdzić, czy rejestrujące się osoby mają 18 lat , użyłem po prostu:

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

Następnie porównaj tylko te dwie daty.

Mam nadzieję, że to może komuś pomóc.

Meloman
źródło
3

Chociaż istnieje wiele akceptowalnych odpowiedzi w odpowiedzi na to pytanie, nie widzę żadnych przykładów submetody wykorzystującej \Datetimeobiekt: https://www.php.net/manual/en/datetime.sub.php

Tak więc, w celach informacyjnych, możesz również użyć a, \DateIntervalaby zmodyfikować \Datetimeobiekt:

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

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

Który zwraca:

2008-01-01

Więcej informacji na temat \DateIntervalmożna znaleźć w dokumentacji: https://www.php.net/manual/en/class.dateinterval.php

Oliver Tappin
źródło
-3

Możesz użyć następującej funkcji, aby odjąć 1 lub dowolne lata od daty.

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

Patrząc na powyższe przykłady, możesz również użyć następujących

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

źródło