我正在尝试编写一个函数,以便我可以输入日期并将其添加到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!
答案 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>';
输出将是:
如果要该月的最后一天是将来的几个月,该功能应为:
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;
}
然后输出将是:
这就是我想要的。我希望这会有所帮助。