Нахождение по-разному отрезков времени между двумя датами

Я хочу, чтобы пользователи могли выбирать диапазон дат и интервал для отображения результатов, например «показать мне результаты с 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 г., он по-прежнему будет содержать все даты января.

В идеале это будет показывать:

  • День: 8 января 2017 г .; 9 января 2017 г .; … 19 января 2017 г .; 20 января 2017 г.
  • Неделя: 8 января 2017 года; 15 января 2017 г.
  • Месяц: январь 2017

Любые предложения о том, как это сделать? Спасибо!

1

Решение

Вы должны проверить при добавлении вашего 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"));

демонстрация

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector