Я уже неделю пытаюсь понять это. Моя жена основала новую таксомоторную компанию, и она попросила меня написать здесь простую веб-страницу, где она могла бы нажать кнопку, чтобы сохранить временную метку, затем снова нажмите, когда она выйдет с работы, а затем создаст вторую временную метку.
У меня есть база данных 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
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';
Вы можете проверить через онлайн-компилятор
Спасибо. Я попробую это, когда вернусь домой :)
Хорошо, теперь ваш код работает, но когда я хочу получить общее количество отработанного времени, например, «дневное время», я использую этот код: $ dagtidhelgtotal = $ dagtidhelgtotal + $ dagtidhelg; Но при этом не учитываются минуты, а просто складываются все часы.
Кажется, это хорошо для одного дня, но как получить общее количество между свиданиями. Опубликуйте структуру своей таблицы. Возможно, мы сможем сделать это полностью на SQL.
Разве я не могу просто преобразовать, например, 08:30 в минуты, в данном случае 510 минут?
@Andreas, конечно gmdate('H:i', $time)
учитывая две даты, указанные как:
$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)
также вы можете связаться со мной по скайпу: kenzhegalin.serik