2015-08-21 5 views
0

я пытаюсь этот код:Получить года и месяц между двумя датами

$start_date = "2015-08-19"; 
$end_date = "2016-02-19"; 
$begin = new DateTime($start_date); 
$end = new DateTime($end_date); 
$interval = new DateInterval('P1Y'); // 1 Year interval 

$period = new DatePeriod($begin, $interval, $end); 
foreach ($period as $dt){ 
    echo $dt->format("Y"); 
} 
$intervals = new DateInterval('P1M'); // 1 month interval 

$periods = new DatePeriod($begin, $intervals, $end); 
foreach ($periods as $dts){ 
    echo $dts->format("m"); 
} 

Я получаю такой вывод:

year:2015 
Month:08,09,...,01 

В этом выходе я не получаю год: 2016 и месяц: 02. Я хочу, чтобы мои данные были такими:

year:2015,2016 
Month:08,09,...,01,02 

Как я могу это получить?

И если моя дата окончания «2016-08-20»

, чем я получаю год: 2016 год, но не получает месяц: 08

Обратите внимание, что моя дата начала и дата окончания не фиксируется.

+0

Если вы понимаете, что не получаете февраль 2016 года. Поскольку вы смотрите на интервалы, которые вы не получаете в 2016 году. Вы можете добавить +1 к месяцу и году? –

+0

так как я могу получить это – ND17

+0

посмотреть: https://vasavaa.wordpress.com/2013/10/30/date-difference-or-count-day-or-month-or-year-between-two- date-in-php/ –

ответ

1

Как упоминалось ранее, дата окончания не входит

Вы также можете изменить дату окончания как DateTime этого

$end = $end->modify('+1 day +1 year'); 

знакомства РНР modify для получения дополнительной информации.

Update

Если конец года более чем 1 год больше, чем даты начала последующего добавления в год будет действительно вернуться в год больше, чем то, что мы хотим.

Решение состоит в том, чтобы проверить и добавить год, только если необходимо так:

if($begin > (new DateTime($end_date))->modify('-1 year')) { 
    $end->modify('+1 year'); 
} 
$end->modify('+1 day'); 
+0

, если моя дата окончания 2016-10-19, чем im, получающая 2017 также мне нужно всего лишь год и месяц между двумя датами, поэтому его не wrking – ND17

+0

@ ND17: Вы правы. Я обновил свой ответ. –

0

начиная с 2016 года и месяца 02 не завершен, вы не получаете его. попробовать это

$start_date = "2015-08-19"; 
$end_date = "2016-02-19"; 
$begin = new DateTime($start_date); 
$end = new DateTime($end_date); 
$end->add(new DateInterval('P1Y1M')); 
$interval = new DateInterval('P1Y'); // 1 Year interval 

$period = new DatePeriod($begin, $interval, $end); 
foreach ($period as $dt){ 
    echo $dt->format("Y"); 
} 
$intervals = new DateInterval('P1M'); // 1 month interval 

$periods = new DatePeriod($begin, $intervals, $end); 
foreach ($periods as $dts){ 
    echo $dts->format("m"); 
} 
+0

, если моя дата окончания - 2016-10-19, чем im, получающая 2017, мне также нужен только год и месяц между двумя датами, поэтому он не будет wrking – ND17

1

Вы можете использовать следующий код для достижения этого:

<?php 
$start = (new DateTime('2015-12-02'))->modify('first day of this month'); 
$end  = (new DateTime('2016-05-06'))->modify('first day of this month'); 

//For Year 
$interval = DateInterval::createFromDateString('1 year'); 
$period = new DatePeriod($start, $interval, $end); 
echo 'Year: '; 

foreach ($period as $dt) 
{ 
    echo $dt->format("Y") . ","; 
} 

//For Month 
$interval = DateInterval::createFromDateString('1 month'); 
$period = new DatePeriod($start, $interval, $end); 
echo '<br/>Month: '; 

foreach ($period as $dt) 
{ 
    echo $dt->format("m") . ","; 
} 
?> 

В качестве альтернативы, вы можете хорошо отобразите его в формате Y-m по следующему коду:

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

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

Мне нужно отобразить в раскрывающемся списке два раскрывающихся списка разницы по году и секунде за месяц – ND17

+0

В этом случае первое решение было бы замечательным. Позвольте мне написать код для выпадающего меню. Пройдет пару минут! –

+0

Нет его также не wrkng bcz \t , если моя конечная дата - 2016-10-19, чем im, получающая 2017, также мне нужен только год и месяц между двумя датами – ND17

Смежные вопросы