Php 在月份中有28,29天的日期上添加月份

Php 在月份中有28,29天的日期上添加月份,php,date,Php,Date,我试图写一个函数,我可以采取一个日期,并添加到它的x个月。例如,如果日期为2019-01-31,则+1个月应为2019-02-28。我的功能似乎只有在我添加1个月后才能正常工作。有没有办法让它增加一个多月 例如,addMonth('2019-01-31',3)-应该是2019-04-30(4月份只有30天,所以到此为止) 让PHPDateTime函数为您完成繁重的工作 $rightnow = new DateTime(); $rightnow->modify('+1 month'); ec

我试图写一个函数,我可以采取一个日期,并添加到它的x个月。例如,如果日期为2019-01-31,则+1个月应为2019-02-28。我的功能似乎只有在我添加1个月后才能正常工作。有没有办法让它增加一个多月

例如,addMonth('2019-01-31',3)-应该是2019-04-30(4月份只有30天,所以到此为止)


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

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

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

默认情况下
DateTime::modify(“+1个月”)
会将当前月份的天数添加到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

如果您想将当前月份的天数添加到当前日期,则@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-01-31
  • 加1个月:2019-02-28
  • 加上3个月:2019-04-30
  • 加上12个月:2020-01-31
  • 加上13个月:2020-02-29

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

不起作用。这跳过了二月。不需要争论,它会跳到2019年3月3日,但如果你在1月31日(今天)加上一个月,这是正确的日期。如果您只想添加特定的天数或其他任何内容,还有许多其他选项。请参阅中有关
modify
方法的用户评论。什么是“一个月”-如果添加2月的daysNice解决方案,它不是正确的日期-在我看来,它应该是这样做的。一个有趣的问题。看看@clinton的答案这个克隆看起来很难看,为什么不直接使用DateTimeImmutable呢
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>';
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;
}