2016-05-09 22 views
0

使用账单付款方式,其账单直接付款,其分期付款期限可能有所不同: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年4月15日,金像30/60/90工作,返回这些付款日期:

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

然而,不与付款等15/45/75:

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

也不与30/45/60:

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

如果结算是在2016年4月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

任何想法如何实现的算法,需要考虑到所有可能性?

+0

我不认为你的例子,甚至工作,因为几个月都没有全部30天呢? –

+0

@JonStirling我正在使用一个月的偏移量来尝试解决它。 – user3514092

回答

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 
+0

好方法,但是每个月的第14天的所有账单实际上应该在15日。你必须考虑每个月,如果他们有相同的天数(30)。 – user3514092

+0

二月呢? – splash58

+0

即使在2月份,在这种情况下也应该是第15天。基本上算法必须返回固定的天数。这是强制性的,以免混淆客户。 – user3514092