Відніміть 1 день за допомогою PHP


83

Я намагаюся взяти об'єкт дати, який виходить із моєї 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

Тому я не розумію, чому вихідний об’єкт дати виходить нормально, але тоді я намагаюся створити додатковий об’єкт дати та модифікувати його, віднімаючи один день, і здається, що я не можу цього зробити. Вихідні дані завжди виходять порожніми.

Відповіді:


147

Ви можете спробувати:

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

1
Ви можете отримати той самий формат $ date_raw з$date_raw = date("r");
sHaDeoNeR

5
Будь обережний! Якщо ви обробляєте дати після 2038 року, це не буде працювати через обмеження цілого числа в PHP (принаймні на 32-бітній платформі). У цьому випадку найбезпечнішим рішенням є використання DateTime( див. Тут ).
Tip-Sy


36
$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 суттєво зменшило кількість головних болів, які перенесли, маніпулюючи датами.


6
date_createце процедурний метод виклику DateTimeконструктора , який дозволяє зменшити ваші 3 рядки в 1 без використання new. Тобтоecho date_create('2017-05-18')->modify('-1 day')->format('Y-m-d H:i:s');
Armfoot

ну, код оригінального asnwer також можна записати в 1 рядок, наприклад:(new \DateTime("2017-05-18"))->modify("-1 day")->format("Y-m-d H:i:s")
Скофілд

22

Об'єктно-орієнтована версія

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

Ваша відповідь додає один день, замість того, щоб її вирахувати. Крім цього, це було б моїм найкращим рішенням.
Бурки

18

Один вкладиш варіант:

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


13

Не впевнені, чому ваш поточний код не працює, але якщо вам конкретно не потрібен об’єкт дати, це буде працювати:

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

Дякуємо Клайву! Цей працював у мене ... так, мені насправді не потрібні були об'єкти дат, мені просто потрібно було надрукувати відформатовані дати.
td-dev

7

Відповідь взято з коментарів до функції strtotime посібника Php:

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

Як щодо цього: спочатку перетворіть його в мітку часу Unix, відніміть 60 * 60 * 24 (рівно один день у секундах), а потім візьміть дату з цього.

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

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


Хороший, тільки я зробив це так: $ newDate = date_create ($ date_raw) -> getTimestamp () - 60 * 60 * 24;
Євген Афанасьєв

Це передбачає, що всі дні складають 24 години, що не відповідає дійсності в ті 2 дні, коли меншість країн рухає годинник на +/- 1 годину, щоб створити ілюзію більш-менш сонячного світла. А ще є високосні секунди.
apokryfos

це чудовий улов @apokryfos. Я б не використовував це для надто наукового розрахунку, але у переважній більшості випадків це все одно має бути добре.
user3413723

-1

Як додати 1 рік до дати, а потім відняти від неї 1 день в asp.net c #

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

Це не PHP.
atheaos
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.