(Laravel)根据开始日期检查今天是否在两个日期之间

时间:2018-01-03 16:14:20

标签: php laravel date php-carbon

我有一张付款表,可以跟踪某些付款。假设我有一个开始日期,可以是任何日期。付款必须每月支付。

例如,我想在需要付款前5天跟踪付款是否到期。这将每天检查。为此,我使用以下方法:

public function isDue()
{
    for ($i = 0; $i <= $this->months; $i++) {

        if (Carbon::now()->format('Y-m-d') >= Carbon::createFromFormat('Y-m-d', $this->start)->addMonthsNoOverflow($i)->subDays(5)->format('Y-m-d')
            &&
            Carbon::now()->format('Y-m-d') <= Carbon::createFromFormat('Y-m-d', $this->start)->addMonthsNoOverflow($i)->format('Y-m-d')
        ) {
            return true;
        }
    }
    return false;
}

$this->start是开始日期。 $this->months表示必须支付多少个月的费用。因此,使用for循环,将根据开始日期检查当前日期。

我的问题基本上是,因为我想做出这样的防守,有没有很好的方法来完成这个,或者像for循环这样的工作?上面的代码对我来说感觉很草率,我担心它不会产生正确的结果。

2 个答案:

答案 0 :(得分:4)

Carbon有一些其他帮助方法可供比较,包括你可以使用的isToday()

public function isDue()
{
    for ($i = 0; $i < $this->months; $i++) {
        if ($this->start_date->addMonthsNoOverflow($i)->subDays(5)->isToday()) {
            return true;
        }
    }

    return false;
}

这将像以前一样为每个月创建一个循环,并检查调整后的日期是否为今天。如果是,则该方法立即返回true

答案 1 :(得分:2)

如果我理解正确,你想检查“开始日期加上几个月”是从现在到现在的5天之间。在这种情况下,您可以这样做:

if ($this->start->addMonthsNoOverflow($i)->between(now()->subDays(5), now()))