获得直接借记账单的付款日期的公式

时间:2016-05-09 11:59:15

标签: php algorithm formula billing invoice

使用结算付款方式,其帐单设置为直接付款,其分期付款期限可能会有所不同:30/60/90天,30/45 / 60,15 / 30/45等等,我该如何准确获取分期付款日期?

这是我到目前为止所做的,但它不适用于例如30/45/60或15/45/75:

$dates = [];     

$invoiceDate = explode('-', $invoiceDate); // yyyy-mm-dd   Generation date


foreach ($installments as $i => $installment) {  // e.g.: $installment = [30, 45, 60]

    if ($installment % 30 == 0) {
        $month = round($installment / 30);

        $date = mktime(0, 0, 0, $invoiceDate[1] + $month, $invoiceDate[2], $invoiceDate[0]);                    
    }
    else {

        $month = 0;
        if ($installment > 30 && count($installments) > 1) {
            $month = floor($installment / 30);
            $installment = abs($installment - ($month * 30));
        }

        $monthOffset = 30 - date('t', mktime(0, 0, 0, $invoiceDate[1] + $month, 1, date('Y')));

        $date = mktime(0, 0, 0, $invoiceDate[1] + $month, (int)$invoiceDate[2] + (int)$installment - $monthOffset, $invoiceDate[0]);

    }




    $dates[] = date('Y-m-d', $date);
}

使用此代码,如果我必须在2016-04-15收费,那么30/60/90等付款就会生效,并返回这些付款日期:

  

15/05/2016   15/06/2016   15/07/2016

但是,不是像15/45/75这样的付款:

  

30/04/2016    31 / 05/2016(应为30)   30/06/2016

也不是30/45/60:

  

15/05/2016    31 / 05/2016(应为30)   15/06/2016

如果结算在2016-04-30完成,则此付款有效:30/45/60

  

30/05/2016   15/06/2016   30/06/2016

15/45/75也是如此:

  

15/05/2016   15/06/2016   15/07/2016

30/60/90:

  

30/05/2016   30/06/2016   30/07/2016

知道如何实现考虑所有可能性的算法吗?

1 个答案:

答案 0 :(得分:0)

使用DAteTime对象来操作日期

 $periods = [ [30,60,90], 
           [30,45,60], 
           [15,30,45]];
$date =  '2016-04-15';

$d = new DateTime($date);

foreach ($periods as $ps) 
   foreach($ps as $p) {
        $t = new DateTime($d->format('Y-m-d'));  
        echo $t->modify('+'.$p.' days')->format('Y-m-d')."\n";
        unset($t);
   }

结果

2016-05-15
2016-06-14
2016-07-14
2016-05-15
2016-05-30
2016-06-14
2016-04-30
2016-05-15
2016-05-30