intervalos - Tengo 2 fechas en PHP, ¿cómo puedo ejecutar un ciclo foreach para pasar por todos esos días?
php for date (8)
Estoy comenzando con una fecha 2010-05-01
y terminando con 2010-05-10
. ¿Cómo puedo iterar a través de todas esas fechas en PHP?
Aquí hay otro simple -
/**
* Date range
*
* @param $first
* @param $last
* @param string $step
* @param string $format
* @return array
*/
function dateRange( $first, $last, $step = ''+1 day'', $format = ''Y-m-d'' ) {
$dates = [];
$current = strtotime( $first );
$last = strtotime( $last );
while( $current <= $last ) {
$dates[] = date( $format, $current );
$current = strtotime( $step, $current );
}
return $dates;
}
Ejemplo:
print_r( dateRange( ''2010-07-26'', ''2010-08-05'') );
Array (
[0] => 2010-07-26
[1] => 2010-07-27
[2] => 2010-07-28
[3] => 2010-07-29
[4] => 2010-07-30
[5] => 2010-07-31
[6] => 2010-08-01
[7] => 2010-08-02
[8] => 2010-08-03
[9] => 2010-08-04
[10] => 2010-08-05
)
Copia de la muestra de php.net para el rango inclusivo :
$begin = new DateTime( ''2012-08-01'' );
$end = new DateTime( ''2012-08-31'' );
$end = $end->modify( ''+1 day'' );
$interval = new DateInterval(''P1D'');
$daterange = new DatePeriod($begin, $interval ,$end);
foreach($daterange as $date){
echo $date->format("Ymd") . "<br>";
}
Esto también incluye la última fecha
$begin = new DateTime( "2015-07-03" );
$end = new DateTime( "2015-07-09" );
for($i = $begin; $i <= $end; $i->modify(''+1 day'')){
echo $i->format("Y-m-d");
}
Si no necesita la última fecha, simplemente elimine =
de la condición.
La conversión a marcas de tiempo de Unix hace que sea más fácil hacer matemática de fecha en php:
$startTime = strtotime( ''2010-05-01 12:00'' );
$endTime = strtotime( ''2010-05-10 12:00'' );
// Loop between timestamps, 24 hours at a time
for ( $i = $startTime; $i <= $endTime; $i = $i + 86400 ) {
$thisDate = date( ''Y-m-d'', $i ); // 2010-05-01, 2010-05-02, etc
}
Cuando use PHP con una zona horaria con horario de verano, asegúrese de agregar un horario que no sea 23:00, 00:00 o 1:00 para protegerlo contra días omitiendo o repitiendo.
Requiere PHP5.3:
$begin = new DateTime(''2010-05-01'');
$end = new DateTime(''2010-05-10'');
$interval = DateInterval::createFromDateString(''1 day'');
$period = new DatePeriod($begin, $interval, $end);
foreach ($period as $dt) {
echo $dt->format("l Y-m-d H:i:s/n");
}
Esto generará todos los días en el período definido entre $start
y $end
. Si desea incluir el décimo, establezca $end
en el 11mo. Puede ajustar el formato a su gusto. Ver el Manual de PHP para DatePeriod .
Usuario esta función: -
function dateRange($first, $last, $step = ''+1 day'', $format = ''Y-m-d'' ) {
$dates = array();
$current = strtotime($first);
$last = strtotime($last);
while( $current <= $last ) {
$dates[] = date($format, $current);
$current = strtotime($step, $current);
}
return $dates;
}
Llamada de uso / función: -
Aumentar por un día: -
dateRange($start, $end); //increment is set to 1 day.
Aumento por mes: -
dateRange($start, $end, "+1 month");//increase by one month
utilice el tercer parámetro si desea establecer el formato de fecha: -
dateRange($start, $end, "+1 month", "Y-m-d H:i:s");//increase by one month and format is mysql datetime
aquí hay una manera:
$date = new Carbon();
$dtStart = $date->startOfMonth();
$dtEnd = $dtStart->copy()->endOfMonth();
$weekendsInMoth = [];
while ($dtStart->diffInDays($dtEnd)) {
if($dtStart->isWeekend()) {
$weekendsInMoth[] = $dtStart->copy();
}
$dtStart->addDay();
}
¡El resultado de $ weekendsInMoth es una variedad de días de fin de semana!
$startTime = strtotime(''2010-05-01'');
$endTime = strtotime(''2010-05-10'');
// Loop between timestamps, 1 day at a time
$i = 1;
do {
$newTime = strtotime(''+''.$i++.'' days'',$startTime);
echo $newTime;
} while ($newTime < $endTime);
o
$startTime = strtotime(''2010-05-01'');
$endTime = strtotime(''2010-05-10'');
// Loop between timestamps, 1 day at a time
do {
$startTime = strtotime(''+1 day'',$startTime);
echo $startTime;
} while ($startTime < $endTime);