PHP: boucle à travers tous les mois dans une gamme de date?

si j'ai une date de début (dites 2009-02-01 ) et une date de fin (dites 2010-01-01 ), Comment puis-je créer une boucle pour passer en revue toutes les dates (mois) dans la gamme?

28
demandé sur Boden Garman 2010-01-28 17:24:07

6 réponses

Essayer

$start = $month = strtotime('2009-02-01');
$end = strtotime('2011-01-01');
while($month < $end)
{
     echo date('F Y', $month), PHP_EOL;
     $month = strtotime("+1 month", $month);
}

l'Esprit de la note http://php.net/manual/de/datetime.formats.relative.php

les valeurs relatives des mois sont calculées en fonction de la longueur des mois qu'elles traversent. Un exemple serait "+2 mois 2011-11-30", qui produirait "2012-01-30". Cela est dû au fait que novembre a une durée de 30 jours, et que décembre a une durée de 31 jours, ce qui donne un total de 61 jours.

à partir de PHP5.3 vous pouvez utiliser http://www.php.net/manual/en/class.dateperiod.php

71
répondu Gordon 2014-10-01 09:49:04

exemple de DateTime , DateInterval et DatePeriod combinaison de classe:

$start = new DateTime('2009-02-01');
$interval = new DateInterval('P1M');
$end = new DateTime('2011-01-01');
$period = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) {
    echo $dt->format('F Y') . PHP_EOL;
}
31
répondu Glavić 2013-08-28 13:22:21

la réponse acceptée n'est pas la bonne.

j'ai essayé cet extrait et il ne fonctionne pas correctement. Si votre date de début est la fin du mois et la date de fin est le début de la 3e mois.

par exemple: 2014-08-31 - 2014-10-01

attendue devrait être.

  • août
  • septembre
  • octobre

la meilleure solution est:

$start    = new DateTime('2010-12-02');
$start->modify('first day of this month');
$end      = new DateTime('2012-05-06');
$end->modify('first day of next month');
$interval = DateInterval::createFromDateString('1 month');
$period   = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) {
    echo $dt->format("Y-m") . "<br>\n";
}

référence: comment inscrire tous les mois entre deux dates

15
répondu 3s2ng 2017-05-23 11:47:19
$start = strtotime('2011-09-01');
$end = strtotime('2013-12-01');
while($start < $end)
{
    echo date('F Y', $start) . '<br>';
    $start = strtotime("+1 month", $start);
}
2
répondu user2643679 2013-09-26 16:12:17

j'aime la simplicité de la réponse acceptée, mais en tant que 3s2ng, cela ne fonctionne pas toujours. Alors je l'ai tweeté comme ceci:

    $start = strtotime('2009-02-01');
    $startmoyr = date('Y', $start) . date('m', $start);
    $end = strtotime('2013-12-01');
    $endmoyr = date('Y', $end) . date('m', $end);

    while ($startmoyr <= $endmoyr) {
        echo date("F Y", $start) . "<br>";
        $start = strtotime("+1month", $start);
        $startmoyr = date('Y', $start) . date('m', $start);
    }
2
répondu Mark 2015-04-17 17:49:57

j'ai une méthode qui est optimale dans les résultats :

$begin = new DateTime( '2014-07-14' );
$end = new DateTime( '2014-08-01' );
$end = $end->modify( '+1 month' );
$interval = DateInterval::createFromDateString('1 month');

$period = new DatePeriod($begin, $interval, $end);

foreach($period as $dt) {
    var_dump($dt->format( "m" ));
}

a plus pour la méthode de @Glavic

1
répondu pollux1er 2014-09-05 11:12:27