使用Laravel 5.2的PHP和未正确添加月份的碳
我创建了一个计算贷款申请摊销计划的方法。我使用Carbon为用户每次还贷增加一个月,下面是我的代码片段:使用Laravel 5.2的PHP和未正确添加月份的碳,php,laravel,php-carbon,Php,Laravel,Php Carbon,我创建了一个计算贷款申请摊销计划的方法。我使用Carbon为用户每次还贷增加一个月,下面是我的代码片段: public function amoritization($amount,$interest_rate,$repaid_months,$start_date) { $beginning_balance = $amount; $interest = $interest_rate/100/12; $payback = $repaid_months; $x =
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,$PAYBAY变量的值为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\u日期现在是'2016-05-14'
在第二次迭代中,$count
现在等于2
,加上2个月
$payment\u日期现在是'2016-07-14'
在第三次迭代中,$count
现在等于3
,加上3个月
$payment\u日期现在是'2016-10-14'
当您在循环中返回时,它在第一次迭代后停止。我也面临同样的问题
显然有一个错误。不能将addMonths()用于月底的日期,如4月30日或5月31日
我仍然不知道为什么,但如果您使用addMonths()和2月1日这样的日期,那么它的计算结果将非常准确
基本上,在使用addMonths()之前,您必须将日期调整为较早的日期
这个bug让我抓狂。我试过这个$info->payment\u date=$payment\u date->addMonths(1);,但是仍然从对象数组中获取每个付款日期属性的相同日期,即2016年10月14日,以避免这些问题(从30日和31日开始逐月添加),碳提供了方法addMonthsNoOverflow()
和subMonthsNoOverflow()