Как получить название месяца из произвольного диапазона
В моем приложении laravel ввод выглядит следующим образом:
$from_year = 2019;
$from_month = 10;
$to_year = 2020;
$to_month = 4;
Ожидаемый результат:
months = [
'October 2019', 'November 2019', 'December 2019', 'January 2020', 'February 2020', 'March 2020', 'April 2020'
]
Заранее спасибо.
5 ответов
Решение
$startDate = date($from_year.'-'.$from_month.'-01');
$diff = (($to_year - $from_year) * 12) + ($to_month - $from_month);
$months = [];
for($i=0;$i<=$diff;$i++) {
$months[] = date('F Y', strtotime('+'.$i.' month', strtotime($startDate)));
}
простой код с
date()
функция
Вы можете использовать пару методов, использующих. Прежде всего, вы можете создать объекты текущей и конечной даты (с 1-м днем месяца), а затем рассчитать разницу в месяцах, используя
date_diff
. Тогда это просто с добавлением месячного интервала.
Ванильное решение PHP будет выглядеть так:
$from_year = 2019;
$from_month = 10;
$to_year = 2020;
$to_month = 4;
$date = new DateTime("$from_year-$from_month-01");
$diff = date_diff($date, new DateTime("$to_year-$to_month-01"));
$monthsDiff = $diff->y * 12 + $diff->m;
$interval = new DateInterval('P1M');
$monthsArray = [];
for($i = 0; $i <= $monthsDiff; $i++){
$monthsArray[] = $date->format('F Y');
$date->add($interval);
}
Кроме того, как видите, я использую
format
метод на
DateTime
объект. Подробнее о методе вы можете прочитать здесь .
$from_year = 2019;
$from_month = 10;
$to_year = 2020;
$to_month = 4;
$start = strtotime($from_year . "-" . $from_month . "-01");
$end = strtotime($to_year . "-" . $to_month . "-01");
$months = [date("F Y",$start)];
while(strtotime(end($months)) < $end){
$months[] = date("F Y",strtotime(end($months) . " +1 month"));
}
попробуйте следующий код
<?php
$from_year = 2019;
$from_month = 10;
$to_year = 2020;
$to_month = 4;
$arr = [];
for($i=$from_year;$i<$to_year;$i++) {
if($i==$from_year){
$fmonth = $from_month;
}else{
$fmonth = 1;
}
for($j=$fmonth;$j<=12;$j++){
array_push($arr,DateTime::createFromFormat('!m', $j)->format('F'). " ".$i);
}
}
for($i=1;$i<=$to_month;$i++){
array_push($arr,DateTime::createFromFormat('!m', $i)->format('F'). " ".$to_year);
}
print_r($arr);
?>
Это можно сделать с помощью библиотек Carbon и CarbonPeriod.
Вот как это происходит:
use Carbon\Carbon;
use Carbon\CarbonPeriod;
$from_year = 2019;
$from_month = 10;
$to_year = 2020;
$to_month = 4;
$fromDate = new Carbon('1-' . $from_month . '-' . $from_year);
$toDate = new Carbon('1-' . $to_month . '-' . $to_year);
$differnces = CarbonPeriod::create($fromDate, '1 month', $toDate);
$differenceInDates = [];
foreach ($differnces as $differnce) {
$differenceInDates[] = $differnce->format("M F");
}
Это даст вам желаемый результат.