Количество часов без учета выходных - PullRequest
0 голосов
/ 03 февраля 2020

Как я могу получить 48 часов без учета выходных? Например сегодня 2020-01-31 23:00:00, я добавляю 48 часов, это должно быть 2020-02-04 23:00:00, но когда я попробовал этот код:

$time = strtotime('+48 hour');

while (date('w', $time) % 6 == 0) {
    $time = strtotime('+1 day', $time);
}

$date = date('Y-m-d H:i:s', $time);

Это дало мне 2020-02-03 23:00:00.

1 Ответ

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

Добро пожаловать в переполнение стека. Поскольку PHP7 доступно на многих серверах, вы можете использовать удобные классы дат. Следующий пример делает именно то, что вы хотите. Используемые классы доступны с PHP5 (в течение нескольких лет).

$start = new DateTime('2020-01-31T23:00:00');
$end = (new DateTime('2020-01-31T23:00:00'))->modify('midnight +3 weekdays');
$interval = new DateInterval('PT1H');

$range = new DatePeriod($start, $interval, $end);
foreach ($range as $date) {
    if ($date->format('N') == 6 || $date->format('N') == 7) {
        continue;
    }
    var_dump($date->format('Y-m-d H:i:s'));
}

Сначала мы определяем дату начала и окончания. Для этого примера я выбрал прошлую пятницу, чтобы продемонстрировать, что суббота и воскресенье игнорируются. Не позволяйте трем дням недели сбить вас с толку. Мы начинаем в полночь даты начала, чтобы получить полные два рабочих дня, включая всю дату начала. Поскольку вы хотели каждый час, мы используем класс DateInterval и определяем почасовой интервал. С началом, концом и интервалом мы можем перебрать диапазон с классом DatePeriod. В l oop мы проверяем, является ли день недели (при условии, что 6 - суббота, а 7 - воскресенье) - суббота и воскресенье, дата будет изменена, пока не будет достигнут следующий понедельник. Выходные данные - каждый час, пропуская выходные.

Пожалуйста, посмотрите в документации php дату и время , чтобы понять, что эти классы могут сделать для вас и как они работают. Не копируйте этот пример.

...