NoLand
NoLand

Reputation: 49

PHP strtotime issue when executing 2 days

I am currently stuck with an issue in strtotime() function. I am preparing a time table for my work where users can enter their work times and the script get all the variables from a xml file and make a pdf... working all smooth so far but there is a strange issue when entering a nightshift.

So I designed a debug example where a user starts his work at 21:00 (9pm) and finish it at 06:00 (6am). I want to get the exact entered working time so I strtotime() every time and compare them.

I guess the issue is because start time is on day 1 and finish time is on day 2 but the script thinks its still on day 1... Sorry but I didn't found any solution for that so I hope someone in here can help me out.

Example Code:

<?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_4_Start = '06:00';
$break_4_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_4_End) - strtotime($break_4_Start);

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

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

?>

EDIT: Found a workaround which works for now, but perhaps someone has a better solution

Code:

<?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;

?>

Upvotes: 0

Views: 132

Answers (3)

Sahil Gulati
Sahil Gulati

Reputation: 15141

Here we are adding 24Hours for opposite time, when start-time is bigger than end-time. In case if you don't have date, You can use this solution.

Try this code snippet here

<?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;

?>

Upvotes: 0

Nandan Bhat
Nandan Bhat

Reputation: 1563

Try the following solution.

Use $start = date("d-m-Y H:i:s",time());

While saving the start/finish/break timings in your XML file.

So all the entries will contain date as well. There will not be any conflicts.

Upvotes: 0

Ahmed Ginani
Ahmed Ginani

Reputation: 6650

if you are using dynamic date with time then use that date with time while strtotime() Or you can use dummy date as:

$start = '2017-01-01 20:30';
$finish = '2017-01-02 06:30';

Upvotes: 1

Related Questions