脚本是用Laravel编写的,我知道这可以通过几个if语句来解决,但我想知道是否有一个我缺少的简单函数。
订阅应在用完前一天收取。因此,如果订阅在31日开始,将在30日开始收费。如果该月有30天,将在29日收费。
如果我使用addMonthsNoOverflow(1)向今天添加另一个月,那么在第三个月,用户将在29日而不是30日收费。
是否有一些功能允许我设置一个假日期,如2月30日,然后再添加一个月?
答案 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。