Я хочу, чтобы пользователи могли выбирать диапазон дат и интервал для отображения результатов, например «показать мне результаты с 1 января 2017 года по 1 апреля 2017 года, перечисленные по дням | неделя | месяц»
Поэтому, если бы они выбрали день, я бы сгруппировал результаты к 1 января 2017 года; 2 января 2017 г .; 3 января 2017 г .; так далее…
Если бы они выбрали неделю, это было бы 1 января 2017 года; 8 января 2017 г .; 15 января 2017 г .; так далее…
Метод, который я использую сейчас, выглядит следующим образом:
if(isset($chosenInterval) && ($chosenInterval == "week" || $chosenInterval == "day") ) {
$timeFormat = "F j, Y";
} else {
$timeFormat = "F Y";
$chosenInterval = "month";
}
$start = (new DateTime($start))->modify('first day of this month');
$end = (new DateTime($stop))->modify('first day of next month');
$interval = DateInterval::createFromDateString('1 '.$chosenInterval);
$period = new DatePeriod($start, $interval, $end);
foreach($period as $dt) {
$dataLabels[] = $dt->format($timeFormat);
}
Проблема в том, что если пользователь выберет 8 января 2017 г. — 20 января 2017 г., он по-прежнему будет содержать все даты января.
В идеале это будет показывать:
Любые предложения о том, как это сделать? Спасибо!
Вы должны проверить при добавлении вашего DateTime
возражает против $dataLabels
если дата до начала или после конца. Если это (и $chosenInterval
не месяц), не добавляйте их:
<?php
$start = "2017-01-08";
$stop = "2017-01-20";
$chosenInterval = "week";
function getDates($start, $stop, $chosenInterval = "week") {
$startDT = new DateTime($start); // make a DateTime out of the date to later compare it
$stopDT = new DateTime($stop); // make a DateTime out of the date to later compare it
if(isset($chosenInterval) && ($chosenInterval == "week" || $chosenInterval == "day") ) {
$timeFormat = "F j, Y";
} else {
$timeFormat = "F Y";
$chosenInterval = "month";
}
$begin = (new DateTime($start))->modify('first day of this month');
$end = (new DateTime($stop))->modify('first day of next month');
$interval = DateInterval::createFromDateString('1 '.$chosenInterval);
$period = new DatePeriod($begin, $interval, $end);
foreach($period as $dt) {
if ($chosenInterval !== "month" && ($dt < $startDT || $dt > $stopDT)) continue; // if date is before start or after end, skip
$dataLabels[] = $dt->format($timeFormat);
}
return $dataLabels;
}
var_dump(getDates($start, $stop));
var_dump(getDates($start, $stop, "day"));
var_dump(getDates($start, $stop, "month"));
Других решений пока нет …