PHP Carbon, get all dates between date range?
PhpPhp CarbonPhp 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();
}
}
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);