Добавить количество дней к дате


124

Я хочу добавить количество дней к текущей дате: я использую следующий код:

$i=30;
echo $date = strtotime(date("Y-m-d", strtotime($date)) . " +".$i."days");

Но вместо правильной даты я получаю следующее: 2592000

Пожалуйста, предложите.




4
поиск с использованием имен тегов, [php] [date] addзаключенных в квадратные скобки, например, в поле поиска. Вы найдете множество ответов на подобные вопросы.
Mikel

Ответы:


247

Это должно быть

echo date('Y-m-d', strtotime("+30 days"));

strtotime

ожидает получить строку, содержащую формат даты на английском языке (США), и попытается преобразовать этот формат в метку времени Unix (количество секунд с 1 января 1970 г. 00:00:00 UTC) относительно метки времени, указанной в now, или текущее время, если сейчас не указано.

пока date

Возвращает строку, отформатированную в соответствии с заданной строкой формата, используя заданную целочисленную метку времени или текущее время, если метка времени не указана.

См. Страницы руководства для

и их функциональные сигнатуры.


Я думаю, что это вызовет проблемы при переходе на летнее время и других забавных элементах календаря. Это вроде как зависит от контекста. Вам нужно подумать, если вы ищете 30 24-часовых блоков, которые при переходе на летнее время могут привести к 23:00.
JJ Rohrer

1
@JJRohrer нет, не будет. strtotimeбудет учитывать любое летнее время для настроенного часового пояса. Переход на летнее время - проблема только тогда, когда вы делаете что-то вроде этого OP: stackoverflow.com/questions/4066035
Гордон

Дело принято. Я подошел к этому вопросу, пытаясь решить что-то более близкое к вопросу, на который вы ссылались. Я надеюсь, что мой вышеупомянутый комментарий заставит других серьезно задуматься о том, чтобы серьезно относиться к своим расчетам даты - обо всех исключениях легко забыть.
JJ Rohrer

64

Это может быть хорошо

function addDayswithdate($date,$days){

    $date = strtotime("+".$days." days", strtotime($date));
    return  date("Y-m-d", $date);

}

4
Вышеупомянутое решение также может быть уплотнено в одну линию, если вам нужно быстрое решение и вы не хотите создавать функцию. echo date ("Ymd", strtotime ("+ 12days", strtotime (20130101)))
Mayank Jaiswal

46
$date = new DateTime();
$date->modify('+1 week');
print $date->format('Y-m-d H:i:s');

или print date('Y-m-d H:i:s', mktime(date("H"), date("i"), date("s"), date("m"), date("d") + 7, date("Y"));


Этот метод касается перехода на летнее время. Я не уверен, что php учитывает другие причуды времени, такие как дополнительные секунды, но, в зависимости от ваших потребностей, вам, вероятно, лучше использовать DateTime или StrToTime, если вы имеете дело с календарными днями.
JJ Rohrer

@chx Это решение также более тщательно позволяет дату; например, новый DateTime ('2016-12-09 10:35:58'); это происходит из метки времени базы данных ...
mshaffer


10

Вы также можете добавить это, если хотите, чтобы дата была 5 дней от определенной даты:

У вас есть переменная с такой датой (полученная из ввода или БД или просто жестко закодированная):

$today = "2015-06-15"; // Or can put $today = date ("Y-m-d");

$fiveDays = date ("Y-m-d", strtotime ($today ."+5 days"));

echo $fiveDays; // Will output 2015-06-20

7

Имейте в виду, что изменение часов из-за перехода на летнее время может вызвать некоторые проблемы при подсчете только дней.

Вот небольшая функция php, которая позаботится об этом:

function add_days($date, $days) {
    $timeStamp = strtotime(date('Y-m-d',$date));
    $timeStamp+= 24 * 60 * 60 * $days;

    // ...clock change....
    if (date("I",$timeStamp) != date("I",$date)) {
        if (date("I",$date)=="1") { 
            // summer to winter, add an hour
            $timeStamp+= 60 * 60; 
        } else {
            // summer to winter, deduct an hour
            $timeStamp-= 60 * 60;           
        } // if
    } // if
    $cur_dat = mktime(0, 0, 0, 
                      date("n", $timeStamp), 
                      date("j", $timeStamp), 
                      date("Y", $timeStamp)
                     ); 
    return $cur_dat;
}



6

Вы можете использовать strtotime ()
$data['created'] = date('Y-m-d H:m:s', strtotime('+1 week'));


6

Я знаю, что это старый вопрос, но для PHP <5.3 вы можете попробовать следующее:

$date = '05/07/2013';
$add_days = 7;
$date = date('Y-m-d',strtotime($date) + (24*3600*$add_days)); //my preferred method
//or
$date = date('Y-m-d',strtotime($date.' +'.$add_days.' days');

5

Вы можете использовать класс DateTime, встроенный в PHP. У него есть метод под названием «добавить», и то, как он используется, подробно продемонстрирован в руководстве: http://www.php.net/manual/en/datetime.add.php

Однако для этого требуется PHP 5.3.0.


5
$date = "04/28/2013 07:30:00";

$dates = explode(" ",$date);

$date = strtotime($dates[0]);

$date = strtotime("+6 days", $date);

echo date('m/d/Y', $date)." ".$dates[1];

4

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

$i=30;
echo  date("Y-m-d",mktime(0,0,0,date('m'),date('d')+$i,date('Y')));

3

Просто и лучше

echo date('Y-m-d H:i:s')."\n";
echo "<br>";
echo date('Y-m-d H:i:s', mktime(date('H'),date('i'),date('s'), date('m'),date('d')+30,date('Y')))."\n";

Попробуй это



2

Используйте эту функцию addDate () для добавления или вычитания дней, месяцев или лет (вам также понадобится дополнительная функцияformatDate ())

/**
 * $date self explanatory
 * $diff the difference to add or subtract: e.g. '2 days' or '-1 month'
 * $format the format for $date
 **/
    function addDate($date = '', $diff = '', $format = "d/m/Y") {
        if (empty($date) || empty($diff))
            return false;
        $formatedDate = reformatDate($date, $format, $to_format = 'Y-m-d H:i:s');
        $newdate = strtotime($diff, strtotime($formatedDate));
        return date($format, $newdate);
    }
    //Aux function
    function reformatDate($date, $from_format = 'd/m/Y', $to_format = 'Y-m-d') {
        $date_aux = date_create_from_format($from_format, $date);
        return date_format($date_aux,$to_format);
    }

Примечание: только для php> = 5.3




1

Несмотря на то, что это старый вопрос, такой способ решения потребует многих ситуаций и кажется надежным. У вас должен быть PHP 5.3.0 или выше.

$EndDateTime = DateTime::createFromFormat('d/m/Y', "16/07/2017");
$EndDateTime->modify('+6 days');
echo $EndDateTime->format('d/m/Y');

У вас может быть любой формат строки даты, и это сработает.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.