Если у меня есть дата начала (скажем 2009-02-01
) и дата окончания (скажем 2010-01-01
), как я могу создать цикл для прохождения всех дат (месяцев) в диапазоне?
PHP: Прокрутите все месяцы в диапазоне дат?
Ответ 1
Try
$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);
}
Обратите внимание на примечание http://php.net/manual/de/datetime.formats.relative.php
Относительные месячные значения рассчитываются на основе длины месяцев, через которые они проходят. Примером может служить "+2 месяц 2011-11-30", который будет производить "2012-01-30". Это связано с тем, что ноябрь составляет 30 дней, а декабрь составляет 31 день в длину, что составляет 61 день.
Начиная с PHP5.3 вы можете использовать http://www.php.net/manual/en/class.dateperiod.php
Ответ 2
Пример DateTime, DateInterval и DatePeriod:
$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;
}
Ответ 3
Принятый ответ неправильный.
Я пробовал этот фрагмент, и он не работает должным образом. Если ваша дата начала - конец месяца, а дата окончания - начало третьего месяца.
Например: 2014-08-31 - 2014-10-01
Ожидаемое должно быть.
- Август
- Сентябрь
- Октябрь
Лучшее решение:
$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";
}
Ответ 4
$start = strtotime('2011-09-01');
$end = strtotime('2013-12-01');
while($start < $end)
{
echo date('F Y', $start) . '<br>';
$start = strtotime("+1 month", $start);
}
Ответ 5
Мне нравится простота принятого ответа, но как 3s2ng, это не всегда работает. Поэтому я tweeked это следующим образом:
$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);
}
Ответ 6
У меня есть метод, который оптимален в результатах:
$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 плюс для метода @Glavic
Ответ 7
Основываясь на ответе Гордона, именно так я и работаю, когда вам нужно провести все месяцы между ними.
$end = strtotime(date("Y-m-01"));
$start = $month = strtotime("-12 months", $end);
while ( $month < $end ) {
echo date("Y-m-d", $month));
$month = strtotime("+1 month", $month);
}
Это результат, если я выполню этот код сейчас:
2018-05-01
2018-06-01
2018-07-01
2018-08-01
2018-09-01
2018-10-01
2018-11-01
2018-12-01
2019-01-01
2019-02-01
2019-03-01
2019-04-01
Обратите внимание, что это не включает текущий месяц. Если вам нужно включить текущий месяц, вы можете установить переменную "$ end" на первый день следующего месяца.
$current_first_day_of_the_month = date("Y-m-01");
$end = strtotime("$current_first_day_of_the_month +1 month");
$start = $month = strtotime("-12 months", $end);
Надеюсь, это поможет, привет.