Вычтите 1 день с помощью PHP

Я пытаюсь взять объект даты, который выходит из моей Drupal CMS, вычесть один день и распечатать обе даты. Вот что у меня есть

$date_raw = $messagenode->field_message_date[0]['value']; print($date_raw); //this gives me the following string: 2011-04-24T00:00:00 $date_object = date_create($date_raw); $next_date_object = date_modify($date_object,'-1 day'); print('First Date ' . date_format($date_object,'Ym-d')); //this gives me the correctly formatted string '2011-04-24' print('Next Date ' . date_format($next_date_object,'Ym-d')); //this gives me nothing. The output here is always blank 

Поэтому я не понимаю, почему исходный объект даты выходит из строя, но затем я пытаюсь создать дополнительный объект даты и изменить его, вычитая один день, и кажется, что я не могу этого сделать. Выход всегда остается пустым.

    Можешь попробовать:

     print('Next Date ' . date('Ym-d', strtotime('-1 day', strtotime($date_raw)))); 
      date('Ym-d',(strtotime ( '-1 day' , strtotime ( $date) ) )); 

    Объектно-ориентированная версия

     $dateObject = new DateTime( $date_raw ); print('Next Date ' . $dateObject->sub( new DateInterval('P1D') )->format('Ym-d'); 

    Не знаете, почему ваш текущий код не работает, но если вам не нужен конкретный объект, это будет работать:

     $first_date = strtotime($date_raw); $second_date = strtotime('-1 day', $first_date); print 'First Date ' . date('Ym-d', $first_date); print 'Next Date ' . date('Ym-d', $second_date); 
     $date = new DateTime("2017-05-18"); // For today/now, don't pass an arg. $date->modify("-1 day"); echo $date->format("Ymd H:i:s"); 

    Использование DateTime значительно уменьшило количество головных болей, перенесенных во время манипулирования датами.

    Как насчет этого: сначала преобразуйте его в временную метку unix, вычтите 60 * 60 * 24 (ровно один день в секундах), а затем возьмите дату из этого.

     $newDate = strtotime($date_raw) - 60*60*24; echo date('Ym-d',$newDate); 

    Примечание: как указывал апокрифос, это технически было бы отброшено изменениями летнего времени, когда будет день с 25 или 23 часами

    Вариант с одним слоем :

     echo date_create('2011-04-24')->modify('-1 days')->format('Ym-d'); 

    Запуск его в онлайн-редакторе PHP .


    альтернатива mktime

    Если вы предпочитаете избегать использования строковых методов или входить в вычисления или даже создавать дополнительные переменные, mktime поддерживает вычитание и отрицательные значения следующим образом:

     // Today's date echo date('Ym-d'); // 2016-03-22 // Yesterday's date echo date('Ym-d', mktime(0, 0, 0, date("m"), date("d")-1, date("Y"))); // 2016-03-21 // 42 days ago echo date('Ym-d', mktime(0, 0, 0, date("m"), date("d")-42, date("Y"))); // 2016-02-09 //Using a previous date object $date_object = new DateTime('2011-04-24'); echo date('Ym-d', mktime(0, 0, 0, $date_object->format("m"), $date_object->format("d")-1, $date_object->format("Y") ) ); // 2011-04-23 

    Редактор PHP в Интернете