Как найти количество дней между двумя днями недели?

Как найти количество дней между двумя днями не даты с помощью PHP?

Я знаю, как получить количество дней между двумя датами, но мои входные значения - это названия дней (без даты).

Входы/выходы:

Wednesday и Saturday возвращает 3

Sunday и Wednesday возвращает 3


person predactor    schedule 07.11.2017    source источник


Ответы (3)


Ваша задача, похоже, вообще не требует функций даты. Достаточно будет простого поискового массива.

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

Код: (Демо)

function daysUntil($start, $end) {
    $lookup = [
        'Sunday' => 0,
        'Monday' => 1,
        'Tuesday' => 2,
        'Wednesday' => 3,
        'Thursday' => 4,
        'Friday' => 5,
        'Saturday' => 6
    ];
    $days = $lookup[$end] - $lookup[$start] + ($lookup[$end] <= $lookup[$start] ? 7 : 0);
    return "{$days} days from {$start} to {$end}\n";
}

echo daysUntil('Wednesday', 'Saturday');  // Thursday, Friday, Saturday
echo daysUntil('Monday', 'Friday');       // Tuesday, Wednesday, Thursday, Friday
echo daysUntil('Thursday', 'Thursday');   // [assumed next week]
echo daysUntil('Friday', 'Monday');       // Saturday, Sunday, Monday
echo daysUntil('Saturday', 'Sunday');     // Sunday
echo daysUntil('Sunday', 'Saturday');     // Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
echo daysUntil('Sunday', 'Wednesday');    // Monday, Tuesday, Wednesday

Выход:

3 days from Wednesday to Saturday
4 days from Monday to Friday
7 days from Thursday to Thursday
3 days from Friday to Monday
1 days from Saturday to Sunday
6 days from Sunday to Saturday
3 days from Sunday to Wednesday

Или вы можете заменить массив поиска четырьмя вызовами функций и получить тот же результат: (Демонстрация)

function daysUntil($start, $end) {
    $days = date('w', strtotime($end)) - date('w', strtotime($start));
    $days += $days < 1 ? 7 : 0;
    return "{$days} days from {$start} to {$end}\n";
}
person mickmackusa    schedule 08.11.2017
comment
правильно, я проверяю другой ответ, но даю неправильный результат - person predactor; 08.11.2017
comment
Я также написал еще один вчера, но у вас все просто, спасибо - person predactor; 08.11.2017
comment
Рад был помочь. (обязательно всегда указывайте свои попытки написания кода вместе с вопросами — это позволит избежать отрицательного ответа на ваши вопросы) - person mickmackusa; 08.11.2017
comment
люди не понимают и быстро минусуют и спамят как дубликат - person predactor; 08.11.2017
comment
Вот почему так важно придумать самый лучший вопрос, какой только можно. Еще не поздно улучшить ваш вопрос в интересах будущих читателей SO. Если вы отредактируете свой вопрос, включив в него неудачную попытку кодирования, я подумаю о том, чтобы проголосовать за него. - person mickmackusa; 08.11.2017

Используйте функцию PHP date_diff() (документы).

$datetime1 = date_create($date_1);
$datetime2 = date_create($date_2);

$interval = date_diff($datetime1, $datetime2);

echo $interval->format('%d'); // For days

Согласно разъяснению, вы можете создать произвольные субботы и среды для его расчета:

$datetime1 = date_create(date('Y-m-d',strtotime('wednesday')));
$datetime2 = date_create(date('Y-m-d',strtotime('saturday')));

$interval = date_diff($datetime1, $datetime2);

echo $interval->format('%d'); // For days

Вернет «3», но в зависимости от того, когда вы его запустили.

person kchason    schedule 07.11.2017
comment
Думаю, я, должно быть, немного рассержен, так как несколько часов назад получил отрицательный голос за мой правильный ответ. Мои извинения, но я должен понизить этот ответ, потому что он не дает правильных результатов. 3v4l.org/BO44o - person mickmackusa; 16.01.2018

Вы можете написать название дня для разбора в новом классе DateTime:

<?php
  $datetime1 = new DateTime('Sunday');
  $datetime2 = new DateTime('Wednesday');
  $interval = $datetime1->diff($datetime2);
  echo $interval->format('%R%a days');
  ?>

Также ниже однострочной версии:

echo (new DateTime('Sunday'))->diff(new DateTime('Wednesday'))->format('%a days');
person Mihai Crăiță    schedule 07.11.2017
comment
Приношу свои извинения, должно быть, я немного рассержен после того, как несколько часов назад поставил отрицательный голос за мой правильный ответ. Этот ответ не дает желаемых результатов. 3v4l.org/lhVOu - person mickmackusa; 16.01.2018