用于计算订阅账单日的碳。 addMonthsNoOverflow(1)但考虑订阅是否在31日开始

时间:2018-04-17 20:33:17

标签: php laravel php-carbon

脚本是用Laravel编写的,我知道这可以通过几个if语句来解决,但我想知道是否有一个我缺少的简单函数。

订阅应在用完前一天收取。因此,如果订阅在31日开始,将在30日开始收费。如果该月有30天,将在29日收费。

如果我使用addMonthsNoOverflow(1)向今天添加另一个月,那么在第三个月,用户将在29日而不是30日收费。

是否有一些功能允许我设置一个假日期,如2月30日,然后再添加一个月?

1 个答案:

答案 0 :(得分:1)

你可以创建一个接受一天的Carbon Macro并返回那一天,除非那个月不存在,在这种情况下它会返回最后一天,例如:

Carbon::macro('thisDayOrLast', function ($day) {
    $last = $this->copy()->lastOfMonth();

    $this->day = ($day > $last->day) ? $last->day : $day;

    return $this;
});

您将存储原始订阅日期,然后确定本月应该对哪些日期进行结算:

Carbon::today()->thisDayOrLast($subscription->day);

如果您想向用户提供每天的列表,他们将在接下来的12个月内收取费用,您可以执行以下操作:

$start = Carbon::today();
$subscription = Carbon::parse('2017-12-31');

foreach (range(1, 12) as $month) {
    $day = $start->addMonthNoOverflow()->thisDayOrLast($subscription->day);

    echo "You will be billed on {$day} in month {$month}\n";
}
  

您将在第1个月的2018-05-31 00:00:00结算

     

您将在第2个月的2018-06-30 00:00:00收费

     

您将在第3个月的2018-07-31 00:00:00收费

     

您将在第4个月的2018-08-31 00:00:00收费

     

您将在第5个月的2018-09-30 00:00:00收费

     

您将在第6个月的2018-10-31 00:00:00收费

     

您将在第7个月的2018-11-30 00:00:00收费

     

您将在第8个月的2018-12-31 00:00:00结算

     

您将在第9个月的2019-01-31 00:00:00结算

     

您将在第10个月的2019-02-28 00:00:00收费

     

您将在第11个月的2019-03-31 00:00:00收费

     

您将在第12个月的2019-04-30 00:00:00收费

注意:宏是一种新的Carbon功能,如果您使用的是旧版本的Laravel,则可能需要使用composer update更新Carbon。