Два диапазона дат возврата - PullRequest
       1

Два диапазона дат возврата

0 голосов
/ 20 февраля 2020

Как вернуть строку с двумя датами, как показано ниже.

Start Date : 11/2/2020
End Date : 26/2/2020

Тогда вывод должен быть таким: 11-26 февраля 2020

Start Date : 26/2/2020
End Date : 5/3/2020

Тогда вывод должен быть таким : С 26 февраля по 5 марта 2020

Start Date : 29/12/2020
End Date : 2/1/2021

Тогда вывод должен быть таким: 29 De c 2020 до 2 января 2021

Пожалуйста, помогите мне решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Один из способов сделать это:

  • поместить ваши детали даты в массивы - ['11', 'Feb', '2020']

  • l oop поверх них в в обратном порядке, из года в день

  • сбросить каждую запись в вашем массиве дат начала, которая имеет то же значение, что и соответствующая запись в вашем массиве дат окончания - до тех пор, пока текущая часть Матчи; вырваться из l oop, как только произойдет первое несовпадение

  • соединить оставшиеся части вместе

function time_range_format($start, $end) {
  for($i=2; $i>=0; --$i) {
    if($end[$i] == $start[$i]) {
      unset($start[$i]);
    }
    else {
      break; // important to leave the loop, once the first non-matching part is encountered
    }
  }
  return ($start ? implode(' ', $start) . ' to ' : '') . implode(' ', $end);
}

var_dump(
  time_range_format(['11', 'Feb', '2020'], ['26', 'Feb', '2020']),
  time_range_format(['26', 'Feb', '2020'], ['5', 'Mar', '2020']),
  time_range_format(['29', 'Dec', '2020'], ['2', 'Jan', '2021']),
  time_range_format(['29', 'Dec', '2020'], ['29', 'Dec', '2020'])
);

Результаты для приведенных выше примеров:

11 to 26 Feb 2020
26 Feb to 5 Mar 2020
29 Dec 2020 to 2 Jan 2021
29 Dec 2020

Проверяя, содержит ли $ start все еще что-либо в конце, и только выпуская to, если он есть, вы можете даже обработать «крайний случай» ”, Даты начала и окончания те же, что и в самой последней строке этого примера.

0 голосов
/ 20 февраля 2020

Добро пожаловать в stackoverflow: -)

PHP имеет собственный класс DateTime , который позволяет выполнять манипуляции с датой и форматирование даты.

В ваших настройках c на тот случай, если вы можете начать преобразовывать две даты в объекты, а затем переформатировать в ожидаемый формат.

Вот пример:

$date = DateTime::createFromFormat('d/m/Y', $startString);

С Имея это в виду, теперь мы можем создать функцию, которая будет проверять ваши требования и возвращать строку в вашем пользовательском формате.

function my_date_range(DateTime $start, DateTime $end)
{
    $sameYear = $start->format('Y') === $end->format('Y');
    $sameMonth = $sameYear && $start->format('m') === $end->format('m');
    $sameDay = $sameMonth && $start->format('d') === $end->format('d');

    if ($sameDay) {
        return $start->format('d M Y');
    }
    if ($sameMonth) {
        return sprintf('%s to %s', $start->format('d'), $end->format('d M Y'));
    }
    if ($sameYear) {
        return sprintf('%s to %s', $start->format('d M'), $end->format('d M Y'));
    }

    return sprintf("%s to %s", $start->format('d M Y'), $end->format('d M Y'));
}

Ниже вы найдете мои примеры дат и использования:

var_dump(
    my_date_range(DateTime::createFromFormat('d/m/Y', '11/2/2020'), DateTime::createFromFormat('d/m/Y', '26/2/2020')),
    my_date_range(DateTime::createFromFormat('d/m/Y', '26/2/2020'), DateTime::createFromFormat('d/m/Y', '5/3/2020')),
    my_date_range(DateTime::createFromFormat('d/m/Y', '29/12/2020'), DateTime::createFromFormat('d/m/Y', '2/1/2021')),
    my_date_range(DateTime::createFromFormat('d/m/Y', '2/1/2021'), DateTime::createFromFormat('d/m/Y', '2/1/2021')),
)

Результат:

string(17) "11 to 26 Feb 2020"
string(21) "26 Feb to 05 Mar 2020"
string(26) "29 Dec 2020 to 02 Jan 2021"
string(11) "02 Jan 2021"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...