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