PHP: 为什么不从日期中减去年份?

PHP: why year not subtracted from date?

下面的代码不会从日期中减去 1 年。为什么?

$date1 = '2021-06-02';
$date2 = new \DateTime(date($date1, strtotime('-1 year')));
echo $date2->format('Y-m-d'); // outputs the same date 2021-06-02

请使用此代码。它总是适合我。

$date1 = '2021-06-02';
$date2 = date("Y-m-d", strtotime("-1 year", strtotime($date1)));
echo $date2; //Output 2020-06-02

这是用于日期时间对象:

$dt = new DateTime('2021-06-02');
$minusOneYearDT = $dt->sub(new DateInterval('P1Y'));
$minusOneYear = $minusOneYearDT->format('Y-m-d');    
echo $minusOneYear;

或制定一个小解决方案:

$time = new DateTime('2021-06-02');
$newtime = $time->modify('-1 year')->format('Y-m-d');
echo $newtime;

您的部分问题是 date 函数的第一个参数是日期格式。

https://www.php.net/manual/en/function.date.php

因此,您正在创建格式为“2021-06-02”的日期字符串。

https://www.php.net/manual/en/datetime.format.php

这不会使用您提供的时间戳中的任何内容,因此会将此字符串传递给 DateTime 的构造函数并创建日期而不是前一年的日期。

您的代码有点混乱:

  • date() 将格式字符串和表示时间点的整数作为参数;然后应用格式为该日期和时间创建一个字符串
  • strtotime() 接受一个字符串,将其解释为一个时间点,returns 一个整数时间戳
  • new DateTime() 接受一个字符串,采用 strtotime 可以接受的任何格式,但创建一个对象表示而不是返回一个整数

您尝试一次使用所有这些,结果一团糟:

  • 您对 date() 的调用具有第一个参数“2021-06-02”,该格式无效。
  • 您对 strtotime() 的调用有一个参数“-1 年”,它只会被解释为“现在之前 1 年”,与您指定的任何其他内容无关。
  • 同时使用这两个函数然后传递给 new \DateTime() 没有多大意义,因为对象可以做那些函数可以做的所有相同的事情。

如果你想使用基于整数的函数,你可以这样写:

$date1 = '2021-06-02';
$date2 = strtotime("$date1 -1 year");
echo date('Y-m-d', $date2); 

如果你想使用基于对象的函数,你可以这样写:

$date1 = '2021-06-02';
$date2 = new \DateTime("$date1 -1 year");
echo $date2->format('Y-m-d'); 

或者这个(注意使用 DateTimeImmutable 而不是 DateTime 来避免 modify 方法改变 $date1 对象:

$date1 = new \DateTimeImmutable('2021-06-02');
$date2 = $date1->modify('-1 year');
echo $date2->format('Y-m-d');