Добавление дней к $ Date в PHP

216

У меня есть дата, возвращенная как часть запроса MySQL в форме 2010-09-17

Я хотел бы установить переменные $ Date2 в $ Date5 следующим образом:

$Date2 = $Date + 1

$Date3 = $Date + 2

и т.д..

чтобы он возвращался 2010-09-18и 2010-09-19т.д ...

я пытался

date('Y-m-d', strtotime($Date. ' + 1 day'))

но это дает мне дату до $Date.

Как правильно получить мои даты в формате «Ymd», чтобы их можно было использовать в другом запросе?

Istari
источник

Ответы:

447

Все, что вам нужно сделать, это использовать daysвместо dayэтого:

<?php
$Date = "2010-09-17";
echo date('Y-m-d', strtotime($Date. ' + 1 days'));
echo date('Y-m-d', strtotime($Date. ' + 2 days'));
?>

И это выводит правильно:

2010-09-18
2010-09-19
shamittomar
источник
7
Он выводит правильно, используя точно dayтак же ... date("Y-m-d", strtotime('2010-09-17 + 1 day'))-> 2010-09-18, date("Y-m-d", strtotime('2010-09-17 + 2 day'))->2010-09-19
Daniel Vandersluis
Просто попробовал это так, и это сработало. Я до сих пор не знаю, почему я получил значение за день до даты начала, когда я сначала попробовал это.
Истари
Что если бы у меня была переменная для количества дней, чтобы добавить?
Карлос Мартинс
3
@Carlos echo date ("Ymd", strtotime ($ Date. '+'. $ Variable. 'Days'));
Прадип Кумар Прабахаран
Нет, этот метод не работает вообще. Возвращается некая дата 2004 года.
gegobyte
81

Если вы используете PHP 5.3, вы можете использовать DateTimeобъект и его addметод:

$Date1 = '2010-09-17';
$date = new DateTime($Date1);
$date->add(new DateInterval('P1D')); // P1D means a period of 1 day
$Date2 = $date->format('Y-m-d');

Взгляните на страницу справочника DateIntervalконструктора, чтобы узнать, как построить другие периоды для добавления к вашей дате (2 дня будет 'P2D', 3 будет 'P3D'и т. Д.).

Без PHP 5.3 вы сможете использовать strtotimeспособ, которым вы это сделали (я тестировал его, и он работает как в 5.1.6, так и в 5.2.10):

$Date1 = '2010-09-17';
$Date2 = date('Y-m-d', strtotime($Date1 . " + 1 day"));
// var_dump($Date2) returns "2010-09-18"
Даниэль Вандерслуис
источник
Извините, Даниэль, но веб-сервер запускает php 5.2.6, так что это не сработает
Istari
2
DateTime::constructиспользует тот же механизм, что и strtotimeдля разбора даты, поэтому вы также можете сделать то, new DateTime("+1 day $date")что не потребовало бы 5.3
Гордон
Я не хотел, чтобы понизить это, но как-то я сделал = /
Стивен
Это актуальный ответ для php 5.5+
TheLegendaryCopyCoder
29

Начиная с версии PHP 5.2 вы можете использовать модификацию с объектом DateTime:

http://php.net/manual/en/datetime.modify.php

$Date1 = '2010-09-17';
$date = new DateTime($Date1);
$date->modify('+1 day');
$Date2 = $date->format('Y-m-d');

Будьте осторожны при добавлении месяцев ... (и, в меньшей степени, лет)

Omn
источник
принятый ответ дает ответ в течение 15 000+ дней, где этот ответ дает ответ, когда вы добавляете также 25 000+ дней ..
Прадип Кумар Прабахаран
Вы также можете запросить это в DateTimeImmutable (), и вы получите модифицированную копию без риска изменения оригинала.
Хави Монтеро
17

Вот небольшой фрагмент, чтобы продемонстрировать дату модификации:

$date = date("Y-m-d");
//increment 2 days
$mod_date = strtotime($date."+ 2 days");
echo date("Y-m-d",$mod_date) . "\n";

//decrement 2 days
$mod_date = strtotime($date."- 2 days");
echo date("Y-m-d",$mod_date) . "\n";

//increment 1 month
$mod_date = strtotime($date."+ 1 months");
echo date("Y-m-d",$mod_date) . "\n";

//increment 1 year
$mod_date = strtotime($date."+ 1 years");
echo date("Y-m-d",$mod_date) . "\n";
Мадху В Рао
источник
Можете ли вы увидеть мои связанные (задание) [ stackoverflow.com/q/61421783/8919244] ?
Фейсал
8

Вы также можете использовать следующий формат

strtotime("-3 days", time());
strtotime("+1 day", strtotime($date));

Вы можете сложить изменения следующим образом:

strtotime("+1 day", strtotime("+1 year", strtotime($date)));

Обратите внимание на разницу между этим подходом и тем, что в других ответах: вместо объединения значений +1 dayи <timestamp>вы можете просто передать метку времени в качестве второго параметра strtotime.

SztupY
источник
5

Использование переменной для количества дней

$myDate = "2014-01-16";
$nDays = 16;
$newDate = strtotime($myDate . '+ '.$nDays.'days');
echo newDate('d/m/Y', $soma); //format new date 
Карлос Мартинс
источник
5

Вот самое простое решение для вашего запроса

$date=date_create("2013-03-15"); // or your date string
date_add($date,date_interval_create_from_date_string("40 days"));// add number of days 
echo date_format($date,"Y-m-d"); //set date format of the result
Энгр Атик
источник
0

Все должны использовать ниже код:

$nday = time() + ( 24 * 60 * 60);    
echo 'Now:       '. date('Y-m-d') ."\n";    
echo 'Next Day: '. date('Y-m-d', $nday) ."\n";
vikasgore
источник
1
Вы не должны делать это таким образом, в конце концов у вас будут проблемы с високосными секундами
Натан