Добавление месяцев к дате, когда в месяце 28,29 дней - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь написать функцию, в которой я могу взять дату и добавить к ней x месяцев.Например, если дата 2019-01-31, тогда +1 месяц должен быть 2019-02-28.Кажется, мои функции работают, только если я добавляю 1 месяц.Есть ли способ заставить его добавить более одного месяца?

, например, addMonth ('2019-01-31', 3) - должно быть 2019-04-30 (только 30 дней в апреле, поэтому остановитесь на этом).

function addMonth($date, $count)
{
    $start = new DateTime($date);
    $end = clone $start;
    $end->modify("+$count months");

    while (($start->format('m')+1) % 12 != $end->format('m') % 12) {
        $end->modify('-1 day');
    }

    return $end->format('Y-m-d');
}

echo addMonth('2019-01-31', 1); // 2019-02-28 is correct!
echo addMonth('2019-01-31', 3); // should be 2019-04-30!

Ответы [ 3 ]

0 голосов
/ 31 января 2019

По умолчанию DateTime::modify('+1 month') добавит количество дней текущего месяца к объекту DateTime.

Это можно исправить, добавив количество дней в следующем месяце, например:

<?php
function addMonth($date, $count)
{

  $end = clone new DateTime($date);

  $nextMonth = clone $end;
  /*set the date to be first of month to get the next month*/
  $nextMonth->modify('first day of this month');

  for($i = 0;$i < $count; $i++){

    /*get the number of days in the next month*/
    $nextMonth->modify('next month')->modify('last day of this month');
    $numOfDaysInNextMonth = $nextMonth->format('d');

    /*add number of days in the next month to the end date*/
    $end->modify("+$numOfDaysInNextMonth days");

    $nextMonth->modify('first day of this month');
  }
  return $end->format('Y-m-d');
}

echo addMonth('2019-01-31', 1)."<br>"; // 2019-02-28
echo addMonth('2019-01-31', 2)."<br>"; // 2019-03-31
echo addMonth('2019-01-31', 3)."<br>"; // 2019-04-30
0 голосов
/ 31 января 2019

Подход, используемый @Dave, верен, если вы хотите добавить количество дней в текущем месяце к текущей дате, но я не уверен, что это то, что вы ищете.Исходя из вашего вопроса и комментариев в вашем коде, мне кажется, что вы хотите найти последний день месяца, а не количество месяцев в будущем.Это не так просто, так что здесь идет.Сначала решение из @Dave как функция:

function addMonth($date, $count) {
    $dt = DateTime::createFromFormat("Y-m-d", $date)->modify('+'.$count.' month')->format("Y-m-d");
    return $dt;
}

Если вызовы следующие:

echo '<li>Start: '.addMonth('2019-01-31', 0).'</li>';
echo '<li>Plus 1 month: '.addMonth('2019-01-31', 1).'</li>';
echo '<li>Plus 3 months: '.addMonth('2019-01-31', 3).'</li>';
echo '<li>Plus 12 months: '.addMonth('2019-01-31', 12).'</li>';
echo '<li>Plus 13 months: '.addMonth('2019-01-31', 13).'</li>';

, вывод будет:

  • Start: 2019-01-31
  • плюс 1 месяц: 2019-03-03
  • плюс 3 месяца: 2019-05-01
  • плюс 12 месяцев: 2020-01-31
  • Плюс 13 месяцев: 2020-03-02

Если вы хотите последний день месяца, количество месяцев в будущем функция должнабыть:

function addMonth($date, $count) {
    $start = new DateTime($date);
    $start->modify( 'first day of this month' );
    $start->modify('+'.$count.' month');
    $dt = $start->format('Y-m-t');
    return $dt;
}

, и тогда вывод будет:

  • Начало: 2019-01-31
  • Плюс 1 месяц: 2019-02-28
  • Плюс 3 месяца: 2019-04-30
  • Плюс 12 месяцев: 2020-01-31
  • Плюс 13 месяцев: 2020-02-29

что, я думаю, ты хочешь.Я надеюсь, что это помогает.

0 голосов
/ 31 января 2019

Пусть функции PHP DateTime сделают за вас тяжелую работу.

$rightnow = new DateTime();
$rightnow->modify('+1 month');
echo $rightnow->format('m-d-Y');

Если вам нужны переменные даты начала, вы можете передать их начальному вызову DateTime в первой строке (в гггг-мм-дд).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...