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?
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
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;
}
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";
}
$start = strtotime('2011-09-01');
$end = strtotime('2013-12-01');
while($start < $end)
{
echo date('F Y', $start) . '<br>';
$start = strtotime("+1 month", $start);
}
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);
}
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