Текущая дата + 2 месяца

Я написал этот фрагмент кода для отображения текущей даты + 2 месяца:

<?php
    $date = date("d/m/Y");
    $date = strtotime(date("d/m/Y", strtotime($date)) . "+2 months");
    $date = date("d/m/Y",$date);
    echo $date;
?>

Похоже, что он не работает, так как показывает: 03.01.1970.

Что я делаю неправильно?

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ :

Почитав комментарии и ответы, упростил и поправил.

<?php
    $date = date("d/m/Y", strtotime(" +2 months"));
    echo $date;
?>

person morgi    schedule 14.05.2012    source источник
comment
Попробуйте поставить пробел перед +2. И, возможно, использовать две переменные - использование одного и того же имени переменной снова и снова для разных типов данных сбивает с толку и является плохой практикой.   -  person Crontab    schedule 14.05.2012
comment
Правильная проверка возвращаемого значения также помогает.   -  person hakre    schedule 18.05.2012


Ответы (4)


Вам не хватает второго аргумента для второго вызова strtotime():

echo date('d/m/Y', strtotime('+2 months'));
person Alix Axel    schedule 14.05.2012
comment
Будьте особенно осторожны при использовании strotime. 31 июля date('dmY') дает 31072014, а date('dmY', strotime('-1 месяц')) дает 01072014 (я ожидал 30062014). - person Paul Voss; 05.08.2014

Попробуйте использовать объект DateTime:

$date = new DateTime("+2 months");
echo $date->format("d/m/Y");
person John Conde    schedule 14.05.2012
comment
Правильно, но к делу не относится. - person Stanislav Shabalin; 14.05.2012
comment
Почему этот ответ не актуален? Просто любопытно @StanislavShabalin - person Muhammad Ibnuh; 08.08.2017
comment
@MuhammadIbnuh Честно говоря, я не могу вспомнить или понять это пять лет спустя :–) Может быть, потому, что зачем использовать DateTime, когда у вас уже есть strtotime, и можно просто исправить опечатку, как в принятом ответе. - person Stanislav Shabalin; 10.08.2017
comment
@StanislavShabalin, strtotime не дает правильного ответа, попробуйте это, если ваша текущая дата 01 февраля 2019 года, добавьте 2 месяца и попробуйте ... Это дает 02 марта 2019 года. Это должно быть 01 апреля 2019 года. решение бро...? любезно предоставьте - person Shurvir Mori; 19.12.2019

Если сегодня «ГГГГ-мм-31», а в следующем месяце нет 31-го числа, будет показан следующий месяц этого дня, чтобы система отображала результат «+3 месяца» вместо результата «+2 месяца».

Итак, я думаю, это самая безопасная:

$end_date=date("Y-m-d",strtotime("+2 month",strtotime(date("Y-m-01",strtotime("now") ) )));

Сначала измените дату на 1-й день.

person Fenix Lam    schedule 28.07.2016

Использование DateTime->add() или DateTime->modify()

Если вы работаете с существующим объектом DateTime, вы можете использовать один из них:

// Your date
$date = new DateTime(); // empty for now or pass any date string as param

// Adding
$date->add(new DateInterval('P2M')); // where P2M means "plus 2 months"

// or even easier
$date->modify('+2 months');

// Checking
echo $date->format('Y-m-d');

Остерегайтесь добавления месяцев в PHP, он может переполниться на следующий месяц, если день в исходной дате больше, чем общее количество дней в новом месяце. Такое же переполнение происходит с високосными годами при добавлении лет. Почему-то разработчики PHP не считают это ошибкой и просто документируют без решения. Подробнее здесь: PHP DateTime::modify добавление и вычитание месяцев

Я обнаружил, что это наиболее точное решение проблемы переполнения:

$day = $date->format('j');
$date->modify('first day of +2 months')->modify('+'. (min($day, $date->format('t')) - 1) .' days');
person Slava    schedule 11.03.2018