Вычислять ночные часы в php

на меня произвели посадку в приложении руководства кадрами, и я нуждаюсь в том, чтобы предположить часы, что рабочий находится в ночном расписании (с 22:00 в них 06:00). Это программа, чтобы контролировать утомленные часы и должна фигурировать продолжительность службы дня (что очень легкое с $inicio->diff($fin);) но будь должен показывать, что также утомленного времени все часы он работал в ночном расписании. У меня есть два поля datetime в базе данных:

$inicio = new datetime('2019-02-01 00:35:00');
$fin    = new datetime('2019-02-02 08:42:00');

Часы начала и конца могут быть изменчивым, а именно расписания ввода и выводов могут быть различными или оба могут быть в ночном расписании, или один или ни один, (не, если я объясняюсь). Большое спасибо заранее.

0
задан 21.03.2019, 17:00
4 ответа

despuГ©s его хожения и возвращения, я верю в то, что dГ - с нею soluciГіn. Для которого я нуждаюсь, я оно функционирует, но просвет я "pringaillo" в этом php и страховки, которая algГєn gurГє делала бы это лучше с 4 линиями cГіdigo, но как это не мой случай это solucionГ© asГ,, - если в кого-то он служит ему помощью. Так или иначе большое спасибо всем тем, кто побеспокоились о том, чтобы помогать мне. EstarГ© где-то здесь, если я могу помогать другим. Спасибо!

/* 
        Inicio y Fin el mismo día:
            - 07:00  a 15:00 E y S mayor que 06:00 y menor que 22:00
            - 00:00  a 05:00 E y S menor que 06:00
            - 03:00  a 11:00 E menor que 06:00 y S mayor que 6:00 y menor que 22:00
            - 15:00  a 23:00 E mayor que 06:00 menor que 22:00 y S mayor que 22:00

        Inicio y Fin dias diferentes:
            - 23:00  a 07:00
            - 21:30  a 05:00
            - 22:00  a 05:00
    */
    $he = new datetime('2019-01-01 21:00:01');
    $hs = new datetime('2019-01-02 05:59:59');


    $inicio_noche   = new datetime($he->format('y-m-d').' 22:00:00');
    $fin_noche      = new datetime($hs->format('y-m-d').' 06:00:00');
    $medianoche     = new datetime($hs->format('y-m-d').' 00:00:00');

    echo 'Entrada: '.$he->format('H:i:s').'<br/>';
    echo 'Salida: '.$hs->format('H:i:s').'<br/>';
    if ($he->format('d') == $hs->format('d')) {
        echo 'Mismo dia <br/>';
        if ($he->format('H:i:s') >= $medianoche->format('H:i:s') && $hs->format('H:i:s') <= $fin_noche->format('H:i:s')) {
            $diff = $he->diff($hs);
            echo 'E mayor que 0 S menor que 6<br/>';
            echo $diff->format('%H:%i:%s');
        }
        if ($he->format('H:i:s') < $fin_noche->format('H:i:s') && $hs->format('H:i:s') > $fin_noche->format('H:i:s')) {
            $diff = $he->diff($fin_noche);
            echo 'E menor que 6 S mayor que 6<br/>';
            echo $diff->format('%H:%i:%s');
        }
        if ($he->format('H:i:s') > $fin_noche->format('H:i:s') && $hs->format('H:i:s') > $fin_noche->format('H:i:s')) {
            $diff = $he->diff($fin_noche);
            echo 'E mayor que 6 S mayor que 6<br/>';
            echo '00:00:00';
        }
    }

    if ($he->format('d') != $hs->format('d')) {
        echo 'dia distinto <br/>';
        if ($he->format('H:i:s') >= $inicio_noche->format('H:i:s') && $hs->format('H:i:s') <= $fin_noche->format('H:i:s')) {
            $diff = $he->diff($hs);
            echo 'E mayor que 22 S menor que 6<br/>';
            echo $diff->format('%H:%i:%s');
        }
        if ($he->format('H:i:s') < $inicio_noche->format('H:i:s') && $hs->format('H:i:s') <= $fin_noche->format('H:i:s')) {
            $diff = $inicio_noche->diff($hs);
            echo 'E menor que 22 S menor que 6<br/>';
            echo $diff->format('%H:%i:%s');
        }
        if ($he->format('H:i:s') < $inicio_noche->format('H:i:s') && $hs->format('H:i:s') > $fin_noche->format('H:i:s')) {
            $diff = $inicio_noche->diff($fin_noche);
            echo 'E menor que 22 S mayor que 6<br/>';
            echo $diff->format('%H:%i:%s');
        }
    } 
0
ответ дан 02.12.2019, 05:18

Ты мог бы использовать diif :

$inicio = new datetime('2019-02-01 00:35:00');
$fin    = new datetime('2019-02-02 08:42:00');
$diff = $inicio->diff($fin);
echo $diff->h .' horas '. $diff->i . ' Minutos ' . $diff->s . ' Segundos';

В конце концов твой результат был бы:

8 horas 7 Minutos 0 Segundos

для большей детали: diif Php надеялся, что он подает тебя, и удача.!!

1
ответ дан 02.12.2019, 05:18
  • 1
    Спасибо, я буду смотреть ссылку. – Buli 21.03.2019, 22:49

Ты можешь тестировать делать это таким образом:

$inicio = new datetime('2019-02-01 00:35:00');
$fin    = new datetime('2019-02-02 08:42:00');

$intervalo = $inicio->diff($fin);

echo $intervalo->format('%H horas %i minutos %s segundos');

AsГ - ты считаешь часов , минут и секунд , которые есть различия между $inicio и $fin

, Я Надеюсь, что он подает тебя. Приветствие.

0
ответ дан 02.12.2019, 05:18
  • 1
    Большое спасибо, что я ищу, - это как обложение налогом часов, которые работали 22:00 в 06:00. Часы начала и конца могут быть много, но те, которые я нуждаюсь в том, чтобы обложить налогом, он $intervalo, все те в ночном расписании. Спасибо. – Buli 21.03.2019, 22:47

чтобы вычислять различие между твоими двумя переменными (начало и конец) ты должен использовать DATEDIFF

   <?php

    $inicio = new datetime('2019-02-01 00:35:00');
    $fin    = new datetime('2019-02-02 08:42:00');


    $interval = date_diff($inicio, $fin);
    var_dump ($inicio);
    echo  '<br>';
    var_dump ($fin);
    echo  '<br>';
    echo  '<pre>';
    var_dump($interval);
    echo '</pre>';
    ?>

это печатает тебе объект DateInterval

, где h - часы и i - минуты.

object(DateInterval)#3 (15) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(1)
  ["h"]=>
  int(8)
  ["i"]=>
  int(7)
  ["s"]=>
  int(0)
  ["weekday"]=>
  int(0)
  ["weekday_behavior"]=>
  int(0)
  ["first_last_day_of"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  int(1)
  ["special_type"]=>
  int(0)
  ["special_amount"]=>
  int(0)
  ["have_weekday_relative"]=>
  int(0)
  ["have_special_relative"]=>
  int(0)
}

Тогда, для calular рабочее время в ночном расписании ты должен определять конец ночной смены.

$finTurno    = new datetime('2019-02-02 06:00:00');
$horas_trabajadas = date_diff($inicio, $finTurno);

var_dump($horas_trabajadas->h); //5 horas
0
ответ дан 02.12.2019, 05:18
  • 1
    Спасибо за данные ответы так быстро и взять на себя раньше труд помогать мне, Большое спасибо. Утомленное время это вычислило легко с instrucció n $intervalo = $ инициализировался - > diff ($fin); До ahí это легко, что я нуждаюсь в том, чтобы узнать, так это как вычисление времени, которое они работают в ночном расписании. $inicio и $fin могут быть изменчивыми взамен ночное расписание постоянное (22:00 в 06:00), но как я облагаю налогом, если они работают например 21:00 в 05:00, или 00:00 в 08:00 или 07:00 в 15:00 (в этом случае нет ночных часов). Спасибо снова. – Buli 21.03.2019, 22:42