PHP Carbon, get all dates between date range?

PhpPhp Carbon

Php Problem Overview


How can I get all dates between two dates in PHP? Prefer using Carbon for dates.

$from = Carbon::now();
$to = Carbon::createFromDate(2017, 5, 21);

I wanna have all dates between those two dates.. But how? Can only found solutions using strtotime function.

Php Solutions


Solution 1 - Php

As of Carbon 1.29 it is possible to do:

$period = CarbonPeriod::create('2018-06-14', '2018-06-20');

// Iterate over the period
foreach ($period as $date) {
    echo $date->format('Y-m-d');
}

// Convert the period to an array of dates
$dates = $period->toArray();

See documentation for more details: https://carbon.nesbot.com/docs/#api-period.

Solution 2 - Php

Here's how I did it with Carbon

private function generateDateRange(Carbon $start_date, Carbon $end_date)
{
    $dates = [];

    for($date = $start_date->copy(); $date->lte($end_date); $date->addDay()) {
        $dates[] = $date->format('Y-m-d');
    }

    return $dates;
}

Solution 3 - Php

As Carbon is an extension of PHP's built-in DateTime, you should be able to use DatePeriod and DateInterval, exactly as you would with a DateTime object

$interval = new DateInterval('P1D');
$to->add($interval);
$daterange = new DatePeriod($from, $interval ,$to);

foreach($daterange as $date){
    echo $date->format("Ymd"), PHP_EOL;
}

EDIT

If you need to include the final date of the period, then you need to modify it slightly, and adjust $to before generating the DatePeriod

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($from, $interval ,$to);

foreach($daterange as $date){
    echo $date->format("Ymd"), PHP_EOL;
}

Solution 4 - Php

Based on Mark Baker's answer, I wrote this function:

/**
 * Compute a range between two dates, and generate
 * a plain array of Carbon objects of each day in it.
 *
 * @param  \Carbon\Carbon  $from
 * @param  \Carbon\Carbon  $to
 * @param  bool  $inclusive
 * @return array|null
 *
 * @author Tristan Jahier
 */
function date_range(Carbon\Carbon $from, Carbon\Carbon $to, $inclusive = true)
{
    if ($from->gt($to)) {
        return null;
    }

    // Clone the date objects to avoid issues, then reset their time
    $from = $from->copy()->startOfDay();
    $to = $to->copy()->startOfDay();

    // Include the end date in the range
    if ($inclusive) {
        $to->addDay();
    }

    $step = Carbon\CarbonInterval::day();
    $period = new DatePeriod($from, $step, $to);

    // Convert the DatePeriod into a plain array of Carbon objects
    $range = [];

    foreach ($period as $day) {
        $range[] = new Carbon\Carbon($day);
    }

    return ! empty($range) ? $range : null;
}

Usage:

>>> date_range(Carbon::parse('2016-07-21'), Carbon::parse('2016-07-23'));
=> [
     Carbon\Carbon {#760
       +"date": "2016-07-21 00:00:00.000000",
       +"timezone_type": 3,
       +"timezone": "UTC",
     },
     Carbon\Carbon {#759
       +"date": "2016-07-22 00:00:00.000000",
       +"timezone_type": 3,
       +"timezone": "UTC",
     },
     Carbon\Carbon {#761
       +"date": "2016-07-23 00:00:00.000000",
       +"timezone_type": 3,
       +"timezone": "UTC",
     },
   ]

You can also pass a boolean (false) as third argument to exclude the end date.

Solution 5 - Php

This can also be done like this:

new DatePeriod($startDate, new DateInterval('P1D'), $endDate)

Just keep in mind that DatePeriod is an iterator, so if you want an actual array:

iterator_to_array(new DatePeriod($startDate, new DateInterval('P1D'), $endDate))

If you're using Laravel, you could always create a Carbon macro:

Carbon::macro('range', function ($start, $end) {
    return new Collection(new DatePeriod($start, new DateInterval('P1D'), $end));
});

Now you can do this:

foreach (Carbon::range($start, $end) as $date) {
   // ...
}

Solution 6 - Php

Here is what I have:

private function getDatesFromRange($date_time_from, $date_time_to)
    {

        // cut hours, because not getting last day when hours of time to is less than hours of time_from
        // see while loop
        $start = Carbon::createFromFormat('Y-m-d', substr($date_time_from, 0, 10));
        $end = Carbon::createFromFormat('Y-m-d', substr($date_time_to, 0, 10));

        $dates = [];

        while ($start->lte($end)) {

            $dates[] = $start->copy()->format('Y-m-d');

            $start->addDay();
        }

        return $dates;
    }

Example:

$this->getDatesFromRange('2015-03-15 10:10:10', '2015-03-19 09:10:10');

Solution 7 - Php

You can't use loop control variable directly, the next must be work fine

$start = Carbon::today()->startOfWeek();
$end = Carbon::today()->endOfWeek();

$stack = [];

$date = $start;
while ($date <= $end) {

    if (! $date->isWeekend()) {
        $stack[] = $date->copy();
    }
    $date->addDays(1);
}

return $stack;

Solution 8 - Php

You can directly using Carbon

    $start = Carbon::createFromDate(2017, 5, 21);
    $end = Carbon::now();

    while($start < $end){
        echo $start->format("M");
        $start->addMonth();
    }

Solution 9 - Php

This tutorial will provide example of laravel carbon get all months between two dates. step by step explain laravel carbon get all months. This post will give you simple example of carbon get all months between dates. We will use get all months between two dates laravel carbon. Here, Creating a basic example of get months between two dates laravel.

namespace App\Http\Controllers;

use Carbon\Carbon; use Carbon\CarbonPeriod;

class SignaturePadController extends Controller { /** * Write code on Method * * @return response() */ public function index() { $result = CarbonPeriod::create('2020-01-01', '2020-12-01');

    foreach ($result as $dt) {
        echo $dt->format("Y-m");
    }
   $dates = $result->toArray();
}

}

Source : https://www.itsolutionstuff.com/post/laravel-carbon-get-all-months-between-two-dates-exampleexample.html

Solution 10 - Php

//To get just an array of dates, follow this.


        $period = CarbonPeriod::create('2018-06-14', '2018-06-20');
    
        $p = array();
    // If you want just dates
    // Iterate over the period and create push to array
        foreach ($period as $date) {
            $p[] = $date->format('Y-m-d');
        }
    
    // Return an array of dates
      
        return $p;

Solution 11 - Php

Very simple solution (it works with old "<1.29" carbon ) :

// set $start and $end to any date
$start = Carbon::now()->addDays(-10);
$end = Carbon::now();

$dates = [];
for($i = 0; $i < $end->diffInDays($start); $i++){
	$dates[] = (clone $start)->addDays($i)->format('Y-m-d');
}
dd($dates);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1469734View Question on Stackoverflow
Solution 1 - PhpPaulView Answer on Stackoverflow
Solution 2 - PhpSebastian SulinskiView Answer on Stackoverflow
Solution 3 - PhpMark BakerView Answer on Stackoverflow
Solution 4 - PhpTristan JahierView Answer on Stackoverflow
Solution 5 - PhpJonathanView Answer on Stackoverflow
Solution 6 - PhpDariuxView Answer on Stackoverflow
Solution 7 - Phpmarcelo gutierrezView Answer on Stackoverflow
Solution 8 - PhplatecoderView Answer on Stackoverflow
Solution 9 - Phpwhitehawk321View Answer on Stackoverflow
Solution 10 - PhpJawad MultaniView Answer on Stackoverflow
Solution 11 - Phpfico7489View Answer on Stackoverflow