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

Php 用于计算订阅账单日的碳。addMonthsNoOverflow(1),但考虑订阅是否在31日开始,php,laravel,php-carbon,Php,Laravel,Php Carbon,这个脚本是用Laravel编写的,我知道这可以用几个if语句来解决,但我想知道是否有一个我缺少的简单函数 订阅费应在到期前一天收取。因此,如果订阅在31日开始,将在30日计费。如果该月有30天,则将在29日记账 如果我使用addMonthsNoOverflow(1)将另一个月添加到今天,那么在第三个月,用户将在29日而不是30日付费 是否有一些函数允许我设置一个假日期,如2月30日,然后向其添加一个月?您可以创建一个函数,该函数接受一天并返回该天,除非该月不存在,否则它将返回最后一天,例如: C

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

订阅费应在到期前一天收取。因此,如果订阅在31日开始,将在30日计费。如果该月有30天,则将在29日记账

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

是否有一些函数允许我设置一个假日期,如2月30日,然后向其添加一个月?

您可以创建一个函数,该函数接受一天并返回该天,除非该月不存在,否则它将返回最后一天,例如:

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

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

    return $this;
});
您将存储原始订阅日期,然后确定本月应向其计费的日期,您可以执行以下操作:

Carbon::today()->thisDayOrLast($subscription->day);
$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";
}
如果您想向用户提供未来12个月内每天的账单清单,您可以执行以下操作:

Carbon::today()->thisDayOrLast($subscription->day);
$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,您可以创建一个接受某一天并返回该天的函数,除非该月不存在,否则它将返回最后一天,例如:

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

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

    return $this;
});
您将存储原始订阅日期,然后确定本月应向其计费的日期,您可以执行以下操作:

Carbon::today()->thisDayOrLast($subscription->day);
$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";
}
如果您想向用户提供未来12个月内每天的账单清单,您可以执行以下操作:

Carbon::today()->thisDayOrLast($subscription->day);
$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,谢谢。我学到了一些新东西,非常感谢你的回复。谢谢。我学到了一些新东西,非常感谢您的回复