【问题标题】:Formula to get payment dates of direct debit bills获取直接借记账单付款日期的公式
【发布时间】:2016-09-04 01:24:45
【问题描述】:

有一个账单支付方式,账单设置直接扣款,分期可能不同: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 2016 年 7 月 15 日

但是,不适用于 15/45/75 之类的付款:

30/04/2016 31/05/2016(应该是 30) 2016 年 6 月 30 日

也不是 30/45/60:

15/05/2016 31/05/2016(应该是 30) 15/06/2016

如果账单是在 2016 年 4 月 30 日完成的,则此付款有效:30/45/60

30/05/2016 15/06/2016 2016 年 6 月 30 日

75 年 15 月 45 日也是如此:

15/05/2016 15/06/2016 2016 年 7 月 15 日

还有 30/60/90:

30/05/2016 2016 年 6 月 30 日 2016 年 7 月 30 日

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

【问题讨论】:

  • 我认为您的示例甚至不起作用,因为几个月不都是 30 天?
  • @JonStirling 我正在使用一个月的偏移量来尝试解决它。​​

标签: php algorithm formula billing invoice


【解决方案1】:

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

【讨论】:

  • 不错的方法,但每月 14 日的所有账单实际上应该在 15 日。您必须将每个月视为拥有相同的天数 (30)。
  • 二月呢?
  • 即使在二月,在这种情况下也应该是第 15 天。基本上算法必须返回固定的天数。这是强制性的,以免混淆客户。
  • 为什么 31/05/2016 应该是 30/05 而不是 01/06?
  • 这是我们客户想要的。如果第一个月或第二个月是 30,那么在后续迭代中应该是 30,无论该月有多少天。 15 日也是如此,如果发票是在另一天生成的,那么对于任何一天都是如此。但无论如何,他们总是会在 15 日和 30 日开具账单。
猜你喜欢
  • 2013-07-10
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
  • 2013-12-21
  • 2021-04-14
  • 2021-02-10
  • 2018-04-26
  • 2021-12-24
相关资源
最近更新 更多