Проблема с PHP strtotime при выполнении 2 дней

В настоящее время я столкнулся с проблемой в функции strtotime(). Я готовлю расписание для своей работы, где пользователи могут вводить свое рабочее время, а сценарий получает все переменные из файла xml и делает pdf ... пока все работает гладко, но при входе в ночную смену возникает странная проблема.

Поэтому я разработал пример отладки, в котором пользователь начинает свою работу в 21:00 (21:00) и заканчивает ее в 06:00 (6:00). Я хочу получить точное введенное рабочее время, поэтому я strtotime() каждый раз сравниваю их.

Я предполагаю, что проблема в том, что время начала - день 1, а время окончания - день 2, но сценарий считает, что он все еще в день 1 ... Извините, но я не нашел для этого никакого решения, поэтому я надеюсь, что кто-то здесь может помочь меня.

Пример кода:

<?php

set_time_limit(0);
date_default_timezone_set('Europe/Berlin');

$start = '20:30';
$finish = '06:30';
$break_1_Start = '20:45';
$break_1_End = '21:00';
$break_2_Start = '00:00';
$break_2_End = '00:30';
$break_3_Start = '03:00';
$break_3_End = '03:30';
$break
<?php

set_time_limit(0);
date_default_timezone_set('Europe/Berlin');

$start = strtotime('20:30');
$finish = strtotime('06:30');
$break_1_Start = strtotime('20:45');
$break_1_End = strtotime('21:00');
$break_2_Start = strtotime('00:00');
$break_2_End = strtotime('00:30');
$break_3_Start = strtotime('03:00');
$break_3_End = strtotime('03:30');
$break_4_Start = strtotime('06:00');
$break_4_End = strtotime('06:15');

if($finish > $start) {
    $workTime = $finish - $start;
} else {
    $end1 = strtotime('24:00');
    $start1 = strtotime('00:00');
    $starty = $end1 - $start;
    $endy = $finish - $start1;
    $workTime = $starty + $endy;
}


$break1 = $break_1_End - $break_1_Start;
$break2 = $break_2_End - $break_2_Start;
$break3 = $break_3_End - $break_3_Start;
$break4 = $break_4_End - $break_4_Start;

$workTime = $workTime - $break1 - $break2 - $break3 - $break4;

$workTime = $workTime / 60;
$workTime = $workTime / 60;
echo 'Work Time: '.$workTime;

?>
Start = '06:00'; $break
<?php

set_time_limit(0);
date_default_timezone_set('Europe/Berlin');

$start = strtotime('20:30');
$finish = strtotime('06:30');
$break_1_Start = strtotime('20:45');
$break_1_End = strtotime('21:00');
$break_2_Start = strtotime('00:00');
$break_2_End = strtotime('00:30');
$break_3_Start = strtotime('03:00');
$break_3_End = strtotime('03:30');
$break_4_Start = strtotime('06:00');
$break_4_End = strtotime('06:15');

if($finish > $start) {
    $workTime = $finish - $start;
} else {
    $end1 = strtotime('24:00');
    $start1 = strtotime('00:00');
    $starty = $end1 - $start;
    $endy = $finish - $start1;
    $workTime = $starty + $endy;
}


$break1 = $break_1_End - $break_1_Start;
$break2 = $break_2_End - $break_2_Start;
$break3 = $break_3_End - $break_3_Start;
$break4 = $break_4_End - $break_4_Start;

$workTime = $workTime - $break1 - $break2 - $break3 - $break4;

$workTime = $workTime / 60;
$workTime = $workTime / 60;
echo 'Work Time: '.$workTime;

?>
End = '06:15'; /** * Minus when + 1 day */ $workTime = strtotime($finish) - strtotime($start); $break1 = strtotime($break_1_End) - strtotime($break_1_Start); $break2 = strtotime($break_2_End) - strtotime($break_2_Start); $break3 = strtotime($break_3_End) - strtotime($break_3_Start); $break4 = strtotime($break
<?php

set_time_limit(0);
date_default_timezone_set('Europe/Berlin');

$start = strtotime('20:30');
$finish = strtotime('06:30');
$break_1_Start = strtotime('20:45');
$break_1_End = strtotime('21:00');
$break_2_Start = strtotime('00:00');
$break_2_End = strtotime('00:30');
$break_3_Start = strtotime('03:00');
$break_3_End = strtotime('03:30');
$break_4_Start = strtotime('06:00');
$break_4_End = strtotime('06:15');

if($finish > $start) {
    $workTime = $finish - $start;
} else {
    $end1 = strtotime('24:00');
    $start1 = strtotime('00:00');
    $starty = $end1 - $start;
    $endy = $finish - $start1;
    $workTime = $starty + $endy;
}


$break1 = $break_1_End - $break_1_Start;
$break2 = $break_2_End - $break_2_Start;
$break3 = $break_3_End - $break_3_Start;
$break4 = $break_4_End - $break_4_Start;

$workTime = $workTime - $break1 - $break2 - $break3 - $break4;

$workTime = $workTime / 60;
$workTime = $workTime / 60;
echo 'Work Time: '.$workTime;

?>
End) - strtotime($break
<?php

set_time_limit(0);
date_default_timezone_set('Europe/Berlin');

$start = strtotime('20:30');
$finish = strtotime('06:30');
$break_1_Start = strtotime('20:45');
$break_1_End = strtotime('21:00');
$break_2_Start = strtotime('00:00');
$break_2_End = strtotime('00:30');
$break_3_Start = strtotime('03:00');
$break_3_End = strtotime('03:30');
$break_4_Start = strtotime('06:00');
$break_4_End = strtotime('06:15');

if($finish > $start) {
    $workTime = $finish - $start;
} else {
    $end1 = strtotime('24:00');
    $start1 = strtotime('00:00');
    $starty = $end1 - $start;
    $endy = $finish - $start1;
    $workTime = $starty + $endy;
}


$break1 = $break_1_End - $break_1_Start;
$break2 = $break_2_End - $break_2_Start;
$break3 = $break_3_End - $break_3_Start;
$break4 = $break_4_End - $break_4_Start;

$workTime = $workTime - $break1 - $break2 - $break3 - $break4;

$workTime = $workTime / 60;
$workTime = $workTime / 60;
echo 'Work Time: '.$workTime;

?>
Start); $workTime = $workTime - $break1 - $break2 - $break3 - $break4; $workTime = $workTime / 60; $workTime = $workTime / 60; echo 'Work Time: '.$workTime; ?>

РЕДАКТИРОВАТЬ: нашел обходной путь, который работает на данный момент, но, возможно, у кого-то есть лучшее решение

Код:

<?php

set_time_limit(0);
date_default_timezone_set('Europe/Berlin');

$start = strtotime('20:30');
$finish = strtotime('06:30');
$break_1_Start = strtotime('20:45');
$break_1_End = strtotime('21:00');
$break_2_Start = strtotime('00:00');
$break_2_End = strtotime('00:30');
$break_3_Start = strtotime('03:00');
$break_3_End = strtotime('03:30');
$break_4_Start = strtotime('06:00');
$break_4_End = strtotime('06:15');

if($finish > $start) {
    $workTime = $finish - $start;
} else {
    $end1 = strtotime('24:00');
    $start1 = strtotime('00:00');
    $starty = $end1 - $start;
    $endy = $finish - $start1;
    $workTime = $starty + $endy;
}


$break1 = $break_1_End - $break_1_Start;
$break2 = $break_2_End - $break_2_Start;
$break3 = $break_3_End - $break_3_Start;
$break4 = $break_4_End - $break_4_Start;

$workTime = $workTime - $break1 - $break2 - $break3 - $break4;

$workTime = $workTime / 60;
$workTime = $workTime / 60;
echo 'Work Time: '.$workTime;

?>

person NoLand    schedule 08.05.2017    source источник
comment
Так что укажите дату и время   -  person RiggsFolly    schedule 08.05.2017
comment
А как насчет даты? Вы можете использовать функцию time () для хранения точной информации в xml?   -  person Nandan Bhat    schedule 08.05.2017
comment
@NoLand Если у вас нет даты, вы можете использовать мой пост.   -  person Sahil Gulati    schedule 08.05.2017


Ответы (3)


если вы используете динамическую дату со временем, используйте эту дату со временем, пока strtotime() Или вы можете использовать фиктивную дату как:

$start = '2017-01-01 20:30';
$finish = '2017-01-02 06:30';
person Ahmed Ginani    schedule 08.05.2017
comment
спасибо, что сработало как шарм ... не знал, что в том числе свидание возможно ... Спасибо - person NoLand; 08.05.2017

Попробуйте следующее решение.

Используйте 1_

При сохранении времени начала / окончания / перерыва в вашем XML-файле.

Таким образом, все записи также будут содержать дату. Никаких конфликтов не будет.

person Nandan Bhat    schedule 08.05.2017

Здесь мы добавляем 24Hours для противоположного времени, когда start-time больше end-time. Если у вас нет даты, вы можете использовать это решение.

Попробуйте этот фрагмент кода здесь

<?php

set_time_limit(0);
date_default_timezone_set('Europe/Berlin');

$start = '23:00';
$finish = '06:30';
$break_1_Start = '20:45';
$break_1_End = '21:00';
$break_2_Start = '00:00';
$break_2_End = '00:30';
$break_3_Start = '03:00';
$break_3_End = '03:30';
$break_4_Start = '06:00';
$break_4_End = '06:15';
if(strtotime($finish)>  strtotime($start))
{
    $workTime = strtotime($start) - strtotime($finish);
}
else
{
    $date=date_create_from_format("H:i", $finish);
    $date->add(new DateInterval('PT24H'));//added 24 hours.
    $workTime=strtotime($date->format("Y-m-d H:i:s"))-  strtotime($start);
}
/**
 * Minus when + 1 day
 */

$break1 = strtotime($break_1_End) - strtotime($break_1_Start);
$break2 = strtotime($break_2_End) - strtotime($break_2_Start);
$break3 = strtotime($break_3_End) - strtotime($break_3_Start);
$break4 = strtotime($break_4_End) - strtotime($break_4_Start);

$workTime = $workTime - $break1 - $break2 - $break3 - $break4;

$workTime = $workTime / 60;
$workTime = $workTime / 60;
echo 'Work Time: '.(float)$workTime;

?>
person Sahil Gulati    schedule 08.05.2017