236 votes

J'ai 2 dates en PHP, comment puis-je exécuter une boucle foreach pour passer en revue tous ces jours ?

Je commence par une date 2010-05-01 et se terminant par 2010-05-10 . Comment puis-je itérer à travers toutes ces dates en PHP ?

612voto

Gordon Points 156415
$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");
}

Cela donnera tous les jours dans la période définie entre $start y $end . Si vous voulez inclure le 10, définissez $end au 11ème. Vous pouvez ajuster le format à votre convenance. Voir le manuel PHP pour DatePériode . Il nécessite PHP 5.3.

2 votes

Bonne nouvelle - il existe un correctif permettant d'inclure la date de fin dans un drapeau, qui (croisons les doigts) sera intégré dans une prochaine version.

10 votes

$begin->setTime(0,0); $end->setTime(12,0); ou l'initialisation avec l'heure de la date de début car toute heure postérieure à celle de la date de fin inclura la date de fin dans la boucle. Ce n'est pas la solution la plus élégante, mais c'est la meilleure option tant qu'il n'y a pas de drapeau approprié.

1 votes

Cela ne fonctionne pas non plus si les dates de début et de fin sont identiques (par exemple, si vous laissez quelqu'un choisir les dates de début et de fin dans un sélecteur de date), j'ajoute alors un jour à la date de fin.

110voto

sabri Points 441

Cela inclut également la dernière date

$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 vous n'avez pas besoin de la dernière date, supprimez simplement = de la condition.

47voto

Harold1983- Points 1458

La conversion en timestamps unix facilite le calcul des dates 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
}

Lorsque vous utilisez PHP avec un fuseau horaire avec DST, assurez-vous d'ajouter une heure qui n'est pas 23:00, 00:00 ou 1:00 pour vous protéger contre les sauts de jours ou les répétitions.

4 votes

Je n'aime pas le look de ce 86400. Je comprends que c'est 60 * 60 * 24, mais quand même... il y a quelque chose qui m'irrite.

14 votes

Dans ce cas, ça marche, mais s'il y a un passage entre l'heure normale et l'heure d'été, ça échouera car il y a un jour de 90000 secondes que vous aurez deux fois dans votre boucle...

2 votes

Mike, la meilleure chose à faire est de créer une constante et de la nommer "DAY" pour qu'elle soit beaucoup plus facile à lire.

27voto

Copie de l'exemple de php.net pour inclusivement gamme :

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

17voto

HADI Points 712

Voici une autre mise en œuvre 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
)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X