Как рассчитать часы до и после полуночи между 2 временными метками - PullRequest
0 голосов
/ 29 января 2019

Я работаю над приложением часов времени.

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

Периоды выплат нашей компании начинаются с четверга одной недели до четверга следующей недели, поэтому четверг в полночь является отсечкой для текущего периода оплаты.Однако у нас есть сотрудники, которые работают на кладбище с 7 вечера до 5 утра.Если сотрудник работает с 7 вечера среды среды до 5 утра четверга утра, все часы, отработанные ДО полуночи, должны быть добавлены к их предыдущему периоду оплаты, а все часы, отработанные ПОСЛЕ полуночи, должны быть добавлены к следующему периоду оплаты.

Мой вопрос таков: если сотрудник работает в среду вечером и выходит в четверг утром, и у меня есть время начала и окончания в качестве меток времени, как мне определить, сколько часов они работали в среду исколько часов они работали в четверг?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Если вы собираетесь сделать это в MySQL, то:

select timestampdiff(hour, clockout_time, clockin_time)
from work_sessions;

Дает вам разницу в часах.Давайте разберемся с этим дальше:

select timestampdiff(hour, clockout_time, date(clockout_time)) as aftermidnight, timestampdiff(hour, date(clockout_time), clockin_time)
from work_sessions;

Я не проверял это, поэтому, если это дает целочисленное значение для часов, вы можете повысить точность, передавая минуты вместо часов, а затем выполните свои вычисления.

В PHP, если у вас есть две даты, $clockinTime и $clockoutTime, тогда

$diff = $clockoutTime->diff($clockinTime);

вычислит разницу.

$totalHours = $diff->h;

даст вамобщее количество часов.

$afterMidnight = date('H', $date);
$beforeMidnight = $totalHours - $afterMidnight;

и у вас есть расстояния в часах.

Обратите внимание, я не проверял ни один из этого кода, поэтому, если вы столкнетесь с проблемой, сообщите мне об этом..

0 голосов
/ 29 января 2019

Вы обязательно должны проверить https://carbon.nesbot.com/docs/

Небольшой пример из документов:

$mutable = Carbon::now();
$immutable = CarbonImmutable::now();
$modifiedMutable = $mutable->add(1, 'day');
$modifiedImmutable = CarbonImmutable::now()->add(1, 'day');

var_dump($modifiedMutable === $mutable);             // bool(true)
var_dump($mutable->isoFormat('dddd D'));             // string(11) "Saturday 26"
var_dump($modifiedMutable->isoFormat('dddd D'));     // string(11) "Saturday 26"
// So it means $mutable and $modifiedMutable are the same object
// both set to now + 1 day.
var_dump($modifiedImmutable === $immutable);         // bool(false)
var_dump($immutable->isoFormat('dddd D'));           // string(9) "Friday 25"
var_dump($modifiedImmutable->isoFormat('dddd D'));   // string(11) "Saturday 26"
// While $immutable is still set to now and cannot be changed and
// $modifiedImmutable is a new instance created from $immutable
// set to now + 1 day.

$mutable = CarbonImmutable::now()->toMutable();
var_dump($mutable->isMutable());                     // bool(true)
var_dump($mutable->isImmutable());                   // bool(false)
$immutable = Carbon::now()->toImmutable();
var_dump($immutable->isMutable());                   // bool(false)
var_dump($immutable->isImmutable());                 // bool(true)
...