Я пытаюсь взять объект даты, который выходит из моей 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 поддерживает вычитание и отрицательные значения следующим образом:
// 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 в Интернете