Muhaddis
Muhaddis

Reputation: 554

Count next X days without Sunday using Laravel carbon

I am developing a subscription based application using Laravel. I want to change the state of the user to expire after 75 days of subscribing to the package. I want to exclude Sundays from these 75 days.

Consider a scenario where user's account is verified today and he has only access to the premium functionalities for 75 days(without Sundays). After the 75 days, the user needs to resubscribe to get access to the premium functionalities of the application.

I will then set up a middleware which will check if the user's subscription is expired or not.

I have two scenarios to check for expiration:

  1. Save the expiration date column in the users table.
  2. Verify each user's request based on verified_at (datetime) column and prevent premium access if the user subscription is over more than 75 days without Sundays.

I want to achieve this using Laravel Carbon or any other alternative library/functionality.

After 75 Days from Today(11 June) is August 25 🙅‍♂️
After 75 Days from Today(11 June - Excluding Sundays) is September 07 👈

Reference: https://getcalc.com/75business-days-after-today.htm

Upvotes: 0

Views: 1186

Answers (2)

Muhaddis
Muhaddis

Reputation: 554

I can count next 75 days excluding Sundays using the following PHP function

function Next75Days($StartingDate){
        // Count Next 75 Days excluding Sundays
        $Days = 75;

        $d = new DateTime($StartingDate);
        $t = $d->getTimestamp();

        // Loop for 75 days
        for($i=0; $i<$Days; $i++){

            // Add 1 day to timestamp
            $addDay = 86400;

            // Get date of next day
            $nextDay = date('w', ($t+$addDay));

            // if it's Sunday, do $i--1
            if($nextDay == 0) {
                $i--;
            }

            // modify timestamp, add 1 day
            $t = $t+$addDay;
        }

        $d->setTimestamp($t);

        return $d->format('d M Y');

    }

Upvotes: 0

Alberto
Alberto

Reputation: 12909

If 75 is fixed, than you could easily calculate the number of Sundays in the period, and so then you just need adding those days to the 75:

$period_in_days = 75;
if($user->verified_at->dayOfWeek > 2)
    $period_in_days += 11;
else 
    $period_in_days += 10;

The point is, in 75 days there could either 10 or 11 Sundays, and so in order to decide whether there are 10 or 11, we need to check which day is the first day.
Let's say is Monday the first day, so the 75 days should looks like this

1 - Monday
2 - Tuesday
...
71 - Monday
72 - Tuesday
73 - Wednesday
74 - Thursday
75 - Friday

Let's say is Tuesday the first day, so the 75 days should looks like this

1 - Tuesday
2 - Wednesday
...
71 - Tuesday
72 - Wednesday
73 - Thursday
74 - Friday
75 - Saturday

Let's say is Wednesday the first day, so the 75 days should looks like this

1 - Wednesday
2 - Thursday
...
71 - Wednesday
72 - Thursday
73 - Friday
74 - Saturday
75 - Sunday

So if the first day is not neither Monday and Tuesday, then there will be 11 Sundays (10 + the 1 that appears in the [71- 75]), otherwise there will be only 10 Sundays

Upvotes: 1

Related Questions