Вычтите 1 день с PHP

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

$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,'Y-m-d'));

//this gives me the correctly formatted string '2011-04-24'

print('Next Date ' . date_format($next_date_object,'Y-m-d'));

//this gives me nothing. The output here is always blank

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


person td-dev    schedule 04.10.2011    source источник


Ответы (9)


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

print('Next Date ' . date('Y-m-d', strtotime('-1 day', strtotime($date_raw))));
person MasterCassim    schedule 04.10.2011
comment
Вы можете получить тот же формат $date_raw с помощью $date_raw = date("r"); - person sHaDeoNeR; 20.01.2015
comment
Будьте осторожны! Если вы обрабатываете даты после 2038, это не будет работать из-за ограничения размера целого числа в PHP (по крайней мере, на 32-битной платформе). В этом случае самым безопасным решением будет использование DateTime (см. здесь). - person Tip-Sy; 27.01.2016

$date = new DateTime("2017-05-18"); // For today/now, don't pass an arg.
$date->modify("-1 day");
echo $date->format("Y-m-d H:i:s");

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

person aberdat    schedule 18.05.2017
comment
date_create – это процедурный метод вызова DateTime конструктор, который позволяет сократить 3 строки до 1 без использования new. т.е. echo date_create('2017-05-18')->modify('-1 day')->format('Y-m-d H:i:s'); - person Armfoot; 03.02.2018
comment
ну, код из исходного ответа тоже можно записать в 1 строку, например: (new \DateTime("2017-05-18"))->modify("-1 day")->format("Y-m-d H:i:s") - person Scofield; 03.01.2021

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

$dateObject = new DateTime( $date_raw );
print('Next Date ' . $dateObject->sub( new DateInterval('P1D') )->format('Y-m-d');
person Cosmitar    schedule 06.08.2013
comment
ваш ответ добавляет один день, а не вычитает его. В остальном это было бы моим предпочтительным решением. - person Burki; 18.08.2015

Вариант однострочный:

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

Запустите его в онлайн-редакторе PHP. <ч/>

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

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

// Today's date
echo date('Y-m-d'); // 2016-03-22

// Yesterday's date
echo date('Y-m-d', mktime(0, 0, 0, date("m"), date("d")-1, date("Y"))); // 2016-03-21

// 42 days ago
echo date('Y-m-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('Y-m-d',
  mktime(0, 0, 0,
     $date_object->format("m"),
     $date_object->format("d")-1,
     $date_object->format("Y")
    )
); // 2011-04-23

Онлайн-редактор PHP

person Armfoot    schedule 22.03.2016

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

$first_date = strtotime($date_raw);
$second_date = strtotime('-1 day', $first_date);

print 'First Date ' . date('Y-m-d', $first_date);
print 'Next Date ' . date('Y-m-d', $second_date);
person Clive    schedule 04.10.2011
comment
Спасибо Клайв! Это сработало для меня ... да, мне действительно не нужны были объекты даты, мне просто нужно было печатать отформатированные даты. - person td-dev; 04.10.2011

Ответ взят из комментариев к функции strtotime руководства Php:

echo date( "Y-m-d", strtotime( "2009-01-31 -1 day"));

Or

$date = "2009-01-31";
echo date( "Y-m-d", strtotime( $date . "-1 day"));
person cuperto    schedule 22.03.2019

Просто так:

date("Y-m-d", strtotime("-1 day"));

date("Y-m-d", strtotime("-1 months"))

person Militaru    schedule 25.07.2019

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

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

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

person user3413723    schedule 11.06.2015
comment
Хороший вариант, только я сделал так: $newDate =date_create($date_raw)->getTimestamp() - 60*60*24; - person Yevgeniy Afanasyev; 18.08.2015
comment
Это предполагает, что все дни длятся 24 часа, что неверно для тех 2 дней, когда меньшинство мира переводит свои часы на +/- 1 час, чтобы создать иллюзию большего или меньшего количества солнечного света. А еще есть високосные секунды. - person apokryfos; 16.08.2016
comment
это отличный улов @apokryfos. Я бы не стал использовать это для сверхнаучных вычислений, но в подавляющем большинстве случаев это все равно должно быть в порядке. - person user3413723; 16.08.2016

Как добавить 1 год к дате, а затем вычесть из нее 1 день в asp.net c#

Convert.ToDateTime(txtDate.Value.Trim()).AddYears(1).AddDays(-1);
person Code    schedule 15.12.2018
comment
Это не PHP. - person atheaos; 02.04.2019