PHP使用Laravel 5.2和Carbon没有正确添加月份


PHP using Laravel 5.2 and Carbon not adding months correctly

我创建了一个计算贷款申请摊销时间表的方法。我使用Carbon为用户每次支付贷款增加一个月,下面是我的代码片段:

 public function amoritization($amount,$interest_rate,$repaid_months,$start_date)
{
    $beginning_balance = $amount;
    $interest = $interest_rate/100/12;
    $payback = $repaid_months;
    $x = pow(1 + $interest,$payback);
    $monthly_payment = ($beginning_balance*$x*$interest)/($x-1);
    $payment_date = new Carbon($start_date) 

    $info = (object)[]; //convert empty array to an object
    $amoritization = [];
    $count = 0;
    while($payback > 0){
        $total_interest = $interest * $beginning_balance; //interest
        $principal_payment = $monthly_payment - $total_interest; //principal
        $ending_balance = $beginning_balance - $principal_payment; //ending balance
        $info->beginning_balance = (float)$beginning_balance;
        $info->total_interest = $total_interest;
        $info->payment = $monthly_payment;
        $info->principal_payment = $principal_payment;
        $info->ending_balance = $ending_balance;
        $info->payment_date  = $payment_date->addMonths($count++);
        array_push($amoritization,$info);
        $beginning_balance = $ending_balance;
        $info = (object)[];
        $payback--;
    }
    return $amoritization;
}

这个方法在我的控制器中调用如下:

  return $this->calculation->amoritization($data['amount'],$data['interest_rate'],$data['loan_term'],$data['start_date']);

这是一个问题,例如,$start_date变量存储了这个值2016-04-14 10:34:56,$return变量的值为6。在while循环语句中,$info对象添加了payment_date的属性,该属性存储添加的月份:

 $info->payment_date  = $payment_date->addMonths($count++);

当while循环语句循环一次时,我应该得到的值是2016-05-14。然而,这是我从回复中得到的:

payment_date :{date: "2016-10-14 10:34:56.247000", timezone_type: 2, timezone: "Z"}

此外,当我在循环中这样做时:

return    $info->payment_date;

我找回了价值2016-05-14。这可能是什么原因造成的?提前感谢您的帮助,

只需执行:

$info->payment_date  = $payment_date->addMonths(1); //or just $payment_date->addMonth();

比方说:$start_date = '2016-04-14'

您的问题是$count++在第一次迭代中为1,并添加1个月

$payment_date现在是'2016-05-14'

在第二次迭代中,$count现在等于2,并添加2个月

$payment_date现在是'2016-07-14'

在第三次迭代中,$count现在等于3,并添加3个月

$payment_date现在是'2016-10-14'

当您在循环中执行return时,它在第一次迭代后停止。

我也面临同样的问题。

显然有个bug。您不能将addMonths()用于月底的日期,如4月30日或5月31日。

我仍然不确定为什么,但如果你使用addMonths()和2月1日这样的日期,它会很好地正确相加。

基本上,在使用addMonths()之前,您必须将日期调整为较早的日期;

这个虫子让我疯了。