Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Laravel 5.2的PHP和未正确添加月份的碳_Php_Laravel_Php Carbon - Fatal编程技术网

使用Laravel 5.2的PHP和未正确添加月份的碳

使用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 =

我创建了一个计算贷款申请摊销计划的方法。我使用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,$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()