2014-09-10 2 views
1

Эти вопросы будут похожи на старые в месяц, но у меня есть специальная проблема. Я не пытаюсь считать месяцы между двумя датами, но я пытаюсь получить месяцы, включенные в две даты. Объясняю. У меня есть 2 даты:Получите все месяцы между двумя датами в PHP

$begin = new DateTime('2014-07-20'); 
$end = new DateTime('2014-10-10'); 

Между этими двумя датами у меня есть 4 месяца: июль, август, сентябрь, октябрь. Но со сценарием я использую, я не могу найти 4 месяца включены, но только 3. Это сценарий:

$interval = DateInterval::createFromDateString('1 month'); 

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

foreach($period as $dt) { 
    echo $dt->format('m'); 
    $counter++; 
} 

echo $counter; 

Как подсчитать все эти 4 месяца в цикле?

+0

I w ish сделать цикл через все эти месяцы – pollux1er

+0

Ваш пример будет работать только для случаев, когда день в $ begin будет меньше, чем день в $ end. Легким решением было бы установить день в $ начиная с 1-го числа в месяц и установить день в $ end на любой день, не первый (2-й, 3-й или последний). [Пример вашего измененного кода.] (Https://eval.in/191289) –

ответ

3

Вы можете сделать это с помощью простого while() цикла:

$begin = new DateTime('2014-07-20'); 
$end = new DateTime('2014-10-10'); 

while ($begin <= $end) { 
    echo $begin->format('Y-m'), "\n"; 
    $begin->modify('first day of next month'); 
} 

demo

+0

Спасибо, Glavic, это очень элегантный ... И он работает очень хорошо! – pollux1er

1
<?php 
$begin = new DateTime('2014-07-20', new DateTimeZone('Europe/Paris')); 
$end = new DateTime('2014-10-10', new DateTimeZone('Europe/Paris')); 
$end->add(new DateInterval("P1M")); 
$interval = DateInterval::createFromDateString('1 month'); 

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

foreach($period as $dt) { 
    echo $dt->format('m'); 
    echo "\n"; 
    $counter++; 
} 

echo $counter; 

Это кажется немного сложным, но оно должно работать с любой датой (я не тестировал много tho). Я просто добавил месяц на дату $end, чтобы он учитывал тот факт, что вы хотите получить все включенные месяцы за определенный интервал дат.

+0

Хорошо, но если вы сделаете цикл с помощью foreach, вы заметите, что проблема все та же @Lgt ​​ – pollux1er

+0

Проблема с интервалом здесь заключается в том, что он, кажется, составляет 30 дней, эквивалентный месяцам, он не говорит мне, какие месяцы находятся в интервале. – pollux1er

+0

Теперь лучше? Я не тестировал его много, но он работает. – GeoffreyB

0
$begin = strtotime('2014-07-00'); 
$end= strtotime('2014-10-00'); 
$y1 = date('Y', $begin); 
$y2 = date('Y', $end); 
$m1 = date('m', $begin); 
$m2 = date('m', $end); 
$diff = (($y2 - $y1) * 12) + ($m2 - $m1); 
0

Для меня это не является оптимальным решением, но это работает хорошо:

$begin = new DateTime('2014-07-20'); 
$end = new DateTime('2014-10-10'); 
$interval = DateInterval::createFromDateString('1 day'); 
$period = new DatePeriod($begin, $interval, $end); 

$months = array(); 
foreach($period as $dt) { 
    if(!in_array($dt->format("m"), $months)) { 
     $months[] = $dt->format("m"); 
     echo $dt->format("m"); 
     echo '<br>'; 
    } 
} 
Смежные вопросы