设置下个月的付款日期(使用PHP Carbon)



我需要确定下个月的付款日期。所以我选择最后一个预产期再加上一个月。我该怎么做?

我的例子是:上次付款是1月31日,我在做

Carbon::create(2018, 1, 31, 0, 0, 0)->addMonthsNoOverflow(1)

它工作,它给2018-02-28,但在那之后,下一笔付款将在28日再次到期。所以我需要在添加一个月后设定一个日期。

Carbon::create(2018, 2, 28, 0, 0, 0)->addMonthsNoOverflow(1)->day(31)

它给了我2018-03-31,这很好,但如果我把这个公式和第一个例子一起使用

Carbon::create(2018, 1, 31, 0, 0, 0)->addMonthsNoOverflow(1)->day(31)

它给了我溢出CCD_ 3。这就是我的问题。我该怎么办?有类似->setDayNoOverflow(31)的东西吗?

您不应该使用最后付款日期,而是保留第一个日期,并从第一个日期计算所有其他日期,而不是前一个日期:

Carbon::create(2018, 1, 31, 0, 0, 0)
Carbon::create(2018, 1, 31, 0, 0, 0)->addMonthsNoOverflow(1)
Carbon::create(2018, 1, 31, 0, 0, 0)->addMonthsNoOverflow(2)
Carbon::create(2018, 1, 31, 0, 0, 0)->addMonthsNoOverflow(3)

假设你没有这些数据,你仍然可以:

$day = 31;
$date = Carbon::create(2018, 1, 28, 0, 0, 0);
$date->addMonthsNoOverflow(1);
$date->day(min($day, $date->daysInMonth));

Carbon中似乎没有这样的函数,为什么不自己制作呢?

public function setDaysNoOverflow($value)
{
$year = $this->year;
$month = $this->month;
$this->day((int)$value);
if ($month !== $this->month) {
$this->year = $year;
$this->month = $month;
$this->modify('last day of this month');
}
return $this;
}

只要将它添加到Carbon/Carbon.php中,它就可以完成任务。

它基于addMonthsNoOverflow函数源。

警告:未经测试,仅用于启发目的。

我认为这里的实际问题是业务逻辑或数据库模式,而不是日期操作。

尽管我不确定你的订阅模式是什么,但你似乎想跟踪两条独立的信息:

  • 支付服务费用之前的日期
  • 付款到期日

通过尝试将两者存储在一个字段中,您可能会丢失一些信息,就像在一月/二月/三月转换的情况下一样。通过使用单独的字段,你可以防止它,并在每个月建立一个付款到期日,例如KyleK:提出的

$lastPayment->addMonthsNoOverflow(1)->day(
min($paymentDue->day, $lastPayment->daysInMonth)
);

在我看来,这是一种有点复杂的方法,可以通过以下方式大大简化:

  1. 使用工作月(30天(而不是日历月
  2. 放弃最初的付款日期,只在最后一次付款的基础上增加一个月

但是我知道这可能不是由你来决定的。

您可以将其用作循环

// from month
$min = 3;
// to mont
$max = 9;
// all dates
$paymentDates = [];
$date2 = CarbonCarbon::now();
// next day (or today)
$day = $date2->addDay(1)->format('d');
$currentMonth = $date2->format('m');
$year = $date2->format('Y');;

$date = CarbonCarbon::now();
$nextMonth = $currentMonth;
for($i = $min; $i <= $max; $i++) {
$date = CarbonCarbon::create($year, $currentMonth, $day)->addMonthsNoOverflow($nextMonth)->format('d/m/Y');
// add to array
array_push($paymentDates, $date);
// next month
$nextMonth++;
}

您可以使用Carbon Library中提供的addMonth((函数,如下

Carbon::create(2018, 1, 31, 0, 0, 0)->addMonth();

最新更新