This is the one thing I could never get to work.
My problem is to detect the end of one day and the start of the next and then splitting the diff into each day.
Imagine you want to calculate a pay rate but it has to span across midnight.
It also applies to calculating time to run on timed system, or time diff it should've run.
I prefer to record all times in Unix Epoch, that way it's as simple as
hoursWorked = ((stopTime - startTime)/60)/60
Here is a full solution it's in PHP but should be easy enough to build to any language:
<?php
$startTime = "12/31/2008 22:02"; //No AM/PM we'll use 24hour system
$endTime = "01/01/2009 06:27"; //Again no AM/PM and we spaned the midnight time gap.
/*
Use this to test for a normal shift not ocurring durring midnight.
$startTime = "01/01/2008 06:02"; //No AM/PM we'll use 24hour system
$endTime = "01/01/2008 14:27"; //Again no AM/PM and we spaned the midnight time gap.
*/
$startTime = split(' ', $startTime);
$endTime = split(' ', $endTime);
$startTime[1] = split(':', $startTime[1]);
$endTime[1] = split(':', $endTime[1]);
/*
$startTime[0] contains the date
$startTime[1][0] contains the hours
$startTime[1][1] contains the minutes
same is true for endTime
*/
if($startTime[0] != $endTime[0])
{
if(date2epoch($endTime[0]) > date2epoch($startTime[0]))
{
$minutesWorked1 = (59 - $startTime[1][1]); //Calculate how many minutes have occured from begining of shift to midnight
$minutesWorked2 = $endTime[1][1]; //Number of minute from midnight to end of shift
$hoursWorked1 = (23 - $startTime[1][0]);//Number of hours from start of shift to midnight
$hoursWorked2 = $endTime[1][0];//Number of minutes from midnight to end of shift
echo 'Before midnight you worked ' . $hoursWorked1 . ':' . $minutesWorked1 . "\nAfter midnight you worked " . $hoursWorked2 . ':' . $minutesWorked2 . '.';
}
else
{
//SOMETHING MAJOR BAD HAS HAPPENED WHILE LOGGING THE CLOCKINS AND CLOCKOUTS
}
}
else
{
echo 'Today you worked ' . ($endTime[1][0] - $startTime[1][0]) . ':' . ($endTime[1][1] - $startTime[1][1]);
}
function date2epoch($date, $format='m/d/Y')
{
$date = split('/', $date);
return mktime('0', '0', '0', $date[0], $date[1], $date[2]);
}
?>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With