【问题标题】:PHP: why year not subtracted from date?PHP:为什么不从日期中减去年份?
【发布时间】:2021-10-15 23:04:37
【问题描述】:

以下代码不会从日期中减去 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

【问题讨论】:

标签: php date datetime subtraction


【解决方案1】:

请使用此代码。它总是对我有用。

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

【讨论】:

  • 是的,这行得通。谢谢!我想知道为什么我的代码不起作用?..
  • 请检查我对日期对象的回答。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    你的代码有点混乱:

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

    你试图一次使用所有这些,结果一团糟:

    • 您对date() 的调用的第一个参数是“2021-06-02”,这是无效格式。
    • 您对strtotime() 的调用有一个参数“-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'); 
    

    【讨论】:

      猜你喜欢
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 2018-03-12
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多