Нужно добавить количество месяцев в дате - PullRequest
1 голос
/ 03 января 2012

Мне нужен метод для добавления некоторого количества месяцев к любой дате в PHP. Я знаю, как сделать это в MySQL, но не в PHP. Вот моя попытка:

MySQL:

    SELECT DATE_ADD( '2011-12-29', INTERVAL 2
    MONTH ) // Output "2012-02-29"

    SELECT DATE_ADD( '2011-12-30', INTERVAL 2
    MONTH )  // output "2012-02-29"

    SELECT DATE_ADD( '2011-12-31', INTERVAL 2
    MONTH )  // output "2012-02-29"

PHP:

    $date = date_create('2011-12-29');
    $date->modify("+1 month");
    echo $date->format("Y-m-d");
    // Output is "2012-01-29" -- this is correct 

    $date = date_create('2011-12-30');
    $date->modify("+2 month");
    echo $date->format("Y-m-d");
    // Output is "2012-03-01" -- I need the answer like "2012-02-29" 

    $date = date_create('2011-12-31');
    $date->modify("+2 month");
    echo $date->format("Y-m-d");
    // Output is "2012-03-02" -- I need the answer like "2012-02-29" 

Вывод MySQL правильный. Мне нужен тот же вывод в PHP.

Ответы [ 4 ]

2 голосов
/ 03 января 2012

Если вы используете PHP5> = 5.3, все, что вам нужно сделать, это использовать

$date->modify("last day of +2 months");

как предложено в других ответах. Но если вы используете 5.2, вы можете попробовать изменить код следующим образом:

Class DateTimeM Extends DateTime
{
    public function modify ($modify)
    {
            $day = $this->format ('d');
            $buf = new DateTime ($this->format ('Y-m-01\TH:i:sO'));
            $buf->modify ($modify);
            if ($day > $buf->format ('t'))
            {
                    $this->setDate ($buf->format ('Y'), $buf->format ('m'), $buf->format ('t'));
            }
            else
            {
                    $this->setDate ($buf->format ('Y'), $buf->format ('m'), $day);
            }
            $this->setTime ($buf->format ('H'), $buf->format ('i'), $buf->format ('s'));

            return $this;
      }
}

$date = new DateTimeM ('2011-12-29');
$date->modify("+2 month");
echo $date->format("Y-m-d");

Я предлагаю добавить определение класса в отдельный файл и require_once(). Переключитесь с date_create() на использование конструктора объекта нового класса. Метод modify() нового класса изменит дату, используя первый день исходного заданного месяца вместо последнего, и проверит, больше ли исходный данный день месяца, чем число дней в новом месяце.

Преимущество этого подхода в том, что он будет работать, скажем, и $date->modify ('2 year 2 month').

1 голос
/ 03 января 2012

Вот решение, которое может выполнить эту работу за вас:

function addMonths(DateTime $date, $months) {
    $last = clone $date;
    $last = $last->modify("last day of +$months months")->getTimestamp();

    $default = clone $date;
    $default = $default->modify("+$months months")->getTimestamp();

    return $date->setTimestamp(min($last, $default));
}

$date = new DateTime('2011-12-31');
$laterDate = addMonths($date, 2);

Это будет работать независимо от того, с какого дня месяца вы начинаете.

0 голосов
/ 03 января 2012

Прочитайте ссылку Дагона, размещенную в комментариях к вашему вопросу. Экстраполируя на ответ там, я попробовал это, и это работает:

$d = new DateTime("2011-12-31");
$d->modify("last day of +2 months");
echo $d->format("Y-m-d");
// result is 2012-02-29

$d = new DateTime("2012-12-31");
$d->modify("last day of +2 months");
echo $d->format("Y-m-d");
// result is 2013-02-28
0 голосов
/ 03 января 2012

Надеюсь, это вам наверняка поможет.

Я просто пытаюсь добавить дни вместо добавления месяцев

$MonthAdded = strtotime("+60 days",strtotime('2011-12-31'));
echo "After adding month: ".date('Y-m-d', $MonthAdded)."<br>";

Вывод:

After adding month: 2012-02-29
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...