libreria español composer php php-carbon

español - date php



PHP Carbon, obtener todas las fechas entre el rango de fechas? (8)

A partir del carbono 1.29 se puede hacer:

$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();

Consulte la documentación para obtener más detalles: https://carbon.nesbot.com/docs/#api-period .

¿Cómo puedo obtener todas las fechas entre dos fechas en PHP? Prefiero usar carbono para las fechas.

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

Quiero tener todas las fechas entre esas dos fechas ... ¿Pero cómo? Solo puedo encontrar soluciones usando la función strtotime.


Así es como lo hice con Carbon

private function generateDateRange(Carbon $start_date, Carbon $end_date) { $dates = []; for($date = $start_date; $date->lte($end_date); $date->addDay()) { $dates[] = $date->format(''Y-m-d''); } return $dates; }


Basado en la respuesta de Mark Baker, escribí esta función:

/** * 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; }

Uso:

>>> 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", }, ]

También puede pasar un booleano ( false ) como tercer argumento para excluir la fecha de finalización.


Como Carbon es una extensión del DateTime incorporado de PHP, debería poder usar DatePeriod y DateInterval, exactamente como lo haría con un objeto DateTime

$interval = new DateInterval(''P1D''); $to->add($interval); $daterange = new DatePeriod($from, $interval ,$to); foreach($daterange as $date){ echo $date->format("Ymd"), PHP_EOL; }

EDITAR

Si necesita incluir la fecha final del período, debe modificarlo ligeramente y ajustar $to antes de generar el Período de fecha.

$interval = new DateInterval(''P1D''); $daterange = new DatePeriod($from, $interval ,$to); foreach($daterange as $date){ echo $date->format("Ymd"), PHP_EOL; }


Esto es lo que tengo:

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; }

Ejemplo:

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


Esto también se puede hacer así:

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

Solo DatePeriod en cuenta que DatePeriod es un iterador, así que si quieres una matriz real:

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

En el uso de Laravel, siempre se puede crear una macro de carbono:

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

Ahora puedes hacer esto:

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


No puede usar la variable de control de bucle directamente, la próxima debe ser correcta

$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;


Se puede utilizar directamente carbono.

$start = Carbon::createFromDate(2017, 5, 21); $end = Carbon::now(); while($start < $end){ echo $start->format("M"); $start->addMonth(); }