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');
下面的代码不会从日期中减去 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');