下面的代码没有从日期中减去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
您的部分问题是date
函数的第一个参数是日期的格式。
https://www.php.net/manual/en/function.date.php
所以你正在创建一个日期字符串,格式为' 20121-06-02 '。
https://www.php.net/manual/en/datetime.format.php
它不使用你提供的时间戳中的任何东西,所以这个字符串被传递给DateTime的构造函数,并创建日期而不是前一年的日期。
请使用此代码。这对我来说总是很有效。
$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()接受一个格式字符串和一个表示时间点的整数作为参数;然后应用该格式为该日期和时间创建一个字符串
- strtotime()接受一个字符串,将其解释为时间点,并返回一个整数时间戳
- new DateTime()接受一个字符串,
strtotime
可以接受的任何格式,但是创建一个对象表示而不是返回一个整数
你试图一次使用所有这些,结果弄得一团糟:
- 你对
date()
的调用有一个第一个参数'2021-06-02',这不是一个有效的格式。 - 你对
strtotime()
的调用有一个参数'-1 year',它将被解释为' 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');