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

cyvaqqii  于 2023-06-07  发布在  其他
关注(0)|答案(2)|浏览(123)

这个脚本是用Laravel做的,我知道这可以用几个if语句来解决,但我想知道是否有一个简单的函数我错过了。
订阅费应在到期前一天收取。因此,如果订阅在31日开始,则将在30日计费。如果一个月有30天,将在29日结算。
如果我使用addMonthsNoOverflow(1)将另一个月添加到今天,那么在第三个月,用户将在29日而不是30日收费。
有没有什么功能可以让我设置一个假的日期,比如2月30日,然后再加上一个月?

p8h8hvxi

p8h8hvxi1#

你可以创建一个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);

如果你想为用户提供一个列表,列出他们在未来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";
}

您将于2018-05-31 00:00:00在第1个月结算
您将于2018-06-30 00:00:00在第2个月结算
您将于2018-07-31 00:00:00在第3个月结算
您将于2018-08-31 00:00:00在第4个月结算
您将于2018-09-30 00:00:00在第5个月结算
您将于2018-10-31 00:00:00在第6个月结算
您将于2018-11-30 00:00:00在第7个月结算
您将于2018-12-31 00:00:00在第8个月结算
您将于2019-01-31 00:00:00在第9个月结算
您将于2019-02-28 00:00:00在第10个月结算
您将于2019-03-31 00:00:00在第11个月结算
您将于2019-04-30 00:00:00在第12个月结算
注意:宏是Carbon的新功能,如果你使用的是旧版本的Laravel,你可能需要使用composer update更新Carbon。

qoefvg9y

qoefvg9y2#

我只是想分享我的解决方案的基础上山姆的答复添加每月的日期考虑到最大天数在一个月

public static function getDateMonthly($date)
{
    $oldDate = $date;
    $date = (new Carbon($date));
    if ($date->day === $date->copy()->endOfMonth()->day) {
        $lastNextMonthDays = $date->copy()->addMonthNoOverflow()->lastOfMonth()->day;
        $lastCurrentMonthDays = $date->lastOfMonth()->day;
        if ($lastCurrentMonthDays > $lastNextMonthDays) {
            $daysToSum = $lastNextMonthDays;
            $date = $date->addDays($daysToSum)->format('Y-m-d');
        } else {
            $diffInDays = $date->copy()->diffInDays($date->copy()->addMonthNoOverflow()->lastOfMonth());
            $date = $date->addDays($diffInDays)->format('Y-m-d');
        }
    } else {
        $date = $date->addDays($date->copy()->endOfMonth()->day)->format('Y-m-d');
    }
    return $date;
}

相关问题