I am looking for a way to determine the next occurrence of a certain day of a month. This would refer to a numbered day (e.g. the next 30th). Every month should always have one eligible date, so in case a particular month doesn't have the specified day, we wouldn't overflow to the next one, getting the last day of that month instead.
Is there any built in function in Carbon that fits this use case? It seems odd to have the nthOfMonth function and other functions with "No Overflow" without getting this case covered in between.
This function finds the next future occurrence of "nth" day of a month (not weekday). This function won't overflow if there aren't enough days in the month, but will jump to the next one if the "nth" day already passed since the closest future date where we can find would be the next month:
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();
}
Since we are using the $from
date in the last comparison, we want to make sure to copy()
it previously so it doesn't mess the date. Also, depending on your needs, you might consider including equal dates with gte()
instead.