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

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

68 голосов
/ 04 октября 2011

Я пытаюсь взять объект даты, который выходит из моей 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,'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

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

Ответы [ 9 ]

124 голосов
/ 04 октября 2011

Вы можете попробовать:

print('Next Date ' . date('Y-m-d', strtotime('-1 day', strtotime($date_raw))));
56 голосов
/ 04 октября 2011
 date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));
20 голосов
/ 19 мая 2017
$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 значительно уменьшило количество головных болей, перенесенных при манипуляциях с датами.

19 голосов
/ 06 августа 2013

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

$dateObject = new DateTime( $date_raw );
print('Next Date ' . $dateObject->sub( new DateInterval('P1D') )->format('Y-m-d');
12 голосов
/ 22 марта 2016

A однострочник опция:

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

Запуск на Онлайн-редактор PHP . <Ч />

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

Если вы предпочитаете избегать использования строковых методов, вычислений или даже создания дополнительных переменных, 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

12 голосов
/ 04 октября 2011

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

$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);
4 голосов
/ 22 марта 2019

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

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

или

$date = "2009-01-31";
echo date( "Y-m-d", strtotime( $date . "-1 day"));
3 голосов
/ 11 июня 2015

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

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

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

0 голосов
/ 15 декабря 2018

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

Convert.ToDateTime(txtDate.Value.Trim()).AddYears(1).AddDays(-1);
...