如何使用PHP Carbon查找一个月中第n天的下一次出现

bzzcjhmw  于 2023-01-08  发布在  PHP
关注(0)|答案(2)|浏览(147)

我正在寻找一种方法来确定一个月的某一天的下一次出现。这将是指一个编号的日子(例如,下一个30号)。每个月应该总是有一个合格的日期,所以如果一个特定的月份没有指定的日子,* 我们不会溢出到下一个,而是获得该月的最后一天 *。

  • Carbon提供了nthOfMonth函数,但它指的是工作日。
  • 我找到了几个答案,但他们处理的是下个月的那一天,而不是下一个合适的发生一天
  • This answer只提供了开始日期,而在本例中,我们可能需要几个月或几年的时间,并且我们希望从那时起“赶上”订阅
  • This answer看起来更接近,但似乎可以使用Carbon使其更具可读性或更简洁

Carbon中有没有适合这个用例的内置函数?有nthofMonth函数和其他带有“无溢出”的函数而没有在两者之间涵盖这个用例似乎很奇怪。

ar7v8xwq

ar7v8xwq1#

此函数查找一个月的下一个“n”日(不是工作日),而不会溢出:

public function nextNthNoOverflow(int $nth, Carbon $from): Carbon
{
    // Get the fitting day on the $from month as a starting point
    // We do so without overflowing to take into account shorter months
    $day_in_month = $from->copy()->setUnitNoOverflow('day', $nth, 'month');

    // If the date found is greater than the $from starting date we already found the next day
    // Otherwise, jump to the next month without overflowing
    return $day_in_month->gt($from) ? $day_in_month : $day_in_month->addMonthNoOverflow();
}

由于我们在最后一次比较中使用了$from日期,我们希望确保之前使用copy(),这样就不会扰乱日期。此外,根据您的需要,您可以考虑包含与gte()相同的日期。

vuktfyat

vuktfyat2#

要使用Carbon获取一个月中某一天的下一次出现,可以使用next()方法并向其传递一个闭包,该闭包检查当前日期是否是您要查找的日期。

use Carbon\Carbon;

$date = Carbon::now(); $day = 30; // the 30th of the month

$nextOccurrence = $date->next(function (Carbon $date) use ($day) {
    return $date->day == $day; });

echo $nextOccurrence;

这将输出下一次出现的月份的第30天,同时考虑当前日期。如果当前日期已经是该月的第30天,则返回当前日期。

相关问题