PHP считает время и делит дневное / ночное время

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

У меня есть база данных MYSQL со строками, содержащими время начала и время окончания. Мне удалось использовать функцию diff, чтобы узнать, сколько времени проходит между двумя временными метками, но теперь наступает сложная часть.

Поскольку это разные платежи в разное время дня, мне нужно разделить время на более короткое время.

До 19:00 она работает "днем", после этого она работает "ночью" до 06:00 на другой день, затем есть "дневные выходные" и "ночные выходные".

Поэтому, если она создает метку времени с датой и временем: 2018-08-08 06:30, а затем другую метку времени в 2018-08-08 21:00, тогда мне нужен сценарий, который помещает эти данные в ex "$ daytimehours = 12 "" $ daytimeminutes = 30 "и" $ nighttimehours = 3 "" $ nighttimeminutes = 0 "

Мне удалось создать сценарий, который почти работает, но он состоит из нескольких страниц и содержит один оператор if для каждого сценария дневное-ночное, ночное-дневное и т. д.

Кто-нибудь знает, как это решить? или, может быть, просто укажи мне правильное направление. Я был бы счастлив заплатить немного денег, чтобы это заработало.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
140
2

Ответы 2

Мое решение

<?php

date_default_timezone_set('Asia/Almaty');
$endDate     = '2018-08-08 21:00';
$startDate   = '2018-08-08 06:30';

$nightmare   = date('Y-m-d 19:00');
$startDay     = date('Y-m-d 06:00');

$diffMorning = strtotime($nightmare) - strtotime($startDate);
$diffNight   = strtotime($endDate)   - strtotime($nightmare);

echo gmdate('H:i', $diffMorning) . "\n"; // this is the difference from start day till 19:00
echo gmdate('H:i', $diffNight); // this is the difference on nightmare

$total = $diffMorning + $diffNight;
echo intval($total/3600) . " hours \n";
echo $total%3600/60 . " minutes \n";
echo $total%3600%60 . ' seconds';

Вы можете проверить через онлайн-компилятор

также вы можете связаться со мной по скайпу: kenzhegalin.serik

Sakezzz 08.08.2018 07:07

Спасибо. Я попробую это, когда вернусь домой :)

Andreas 08.08.2018 09:18

Хорошо, теперь ваш код работает, но когда я хочу получить общее количество отработанного времени, например, «дневное время», я использую этот код: $ dagtidhelgtotal = $ dagtidhelgtotal + $ dagtidhelg; Но при этом не учитываются минуты, а просто складываются все часы.

Andreas 11.08.2018 09:34

Кажется, это хорошо для одного дня, но как получить общее количество между свиданиями. Опубликуйте структуру своей таблицы. Возможно, мы сможем сделать это полностью на SQL.

Sheikh Azad 11.08.2018 13:15

Разве я не могу просто преобразовать, например, 08:30 в минуты, в данном случае 510 минут?

Andreas 11.08.2018 15:27

@Andreas, конечно gmdate('H:i', $time)

Sakezzz 13.08.2018 05:30

учитывая две даты, указанные как:

$endDate     = '2018-08-08 21:00'; 
$startDate   = '2018-08-08 06:30';

вы можете использовать расширение PHP Date, чтобы добиться такой разницы:

$start = date_create($startDate);
$end = date_create($endDate);
$boundnight = clone($end);
$boundnight->setTime(19,00);

$total_duration = date_diff($end,$start);//total duration from start to end
$day_duration = date_diff($boundnight,$start);//daytime duration
$night_duration = date_diff($end,$boundnight);// nighttime duration

вы можете использовать метод формата для печати удобочитаемой строки следующим образом:

$total_duration=$total_duration->format('%H:%I');
$day_duration=$day_duration->format('%H:%I');
$night_duration=$night_duration->format('%H:%I');

На этом шаге ничего не осталось, но вы говорите, что хотите преобразовать каждую продолжительность в минуты, поэтому давайте создадим функцию:

function toMinute($duration){
    return (count($x=explode(':',$duration))==2?($x[0]*60+$x[1]):false);
}

Тогда вы можете использовать это так:

$total_duration = toMinute($total_duration);
$day_duration = toMinute($day_duration);
$night_duration = toMinute($night_duration);

Выход var_dump($total_duration,$day_duration,$night_duration) на этом этапе:

int(870)
int(750)
int(120)

Другие вопросы по теме