每月有28.29天的日期加上月份

时间:2019-01-31 17:45:59

标签: php date

我正在尝试编写一个函数,以便我可以输入日期并将其添加到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 :(得分:1)

让PHP DateTime函数为您完成繁重的工作。

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

如果您需要可变的开始日期,可以将其传递给第一行上的DateTime初始调用(格式为yyyy-mm-dd)。

答案 1 :(得分:1)

默认情况下,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

答案 2 :(得分:1)

如果要将当前月份的天数添加到当前日期,@ 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>';

输出将是:

  • 开始:2019年1月31日
  • 加1个月:2019-03-03
  • 加3个月:2019-05-01
  • 加12个月:2020年1月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年1月31日
  • 加1个月:2019-02-28
  • 加3个月:2019-04-30
  • 加12个月:2020年1月31日
  • 加13个月:2020-02-29

这就是我想要的。我希望这会有所帮助。