danzs
danzs

Reputation: 13

time night differential computation in PHP

I'm having problems in getting the night differential of an employee. Night differential starts from 10pm to 6am.

If an employee goes to work from 7pm to 5:30am there should be a night differential of 7 hours and 30 minutes.

How can I compute this using PHP?

Thank you very much.

Upvotes: 1

Views: 1897

Answers (1)

Alexey
Alexey

Reputation: 3484

<?php

define('START_NIGHT_HOUR','22');
define('START_NIGHT_MINUTE','00');
define('START_NIGHT_SECOND','00');
define('END_NIGHT_HOUR','06');
define('END_NIGHT_MINUTE','00');
define('END_NIGHT_SECOND','00');

function night_difference($start_work,$end_work)
{
    $start_night = mktime(START_NIGHT_HOUR,START_NIGHT_MINUTE,START_NIGHT_SECOND,date('m',$start_work),date('d',$start_work),date('Y',$start_work));
    $end_night   = mktime(END_NIGHT_HOUR,END_NIGHT_MINUTE,END_NIGHT_SECOND,date('m',$start_work),date('d',$start_work) + 1,date('Y',$start_work));

    if($start_work >= $start_night && $start_work <= $end_night)
    {
        if($end_work >= $end_night)
        {
            return ($end_night - $start_work) / 3600;
        }
        else
        {
            return ($end_work - $start_work) / 3600;
        }
    }
    elseif($end_work >= $start_night && $end_work <= $end_night)
    {
        if($start_work <= $start_night)
        {
            return ($end_work - $start_night) / 3600;
        }
        else
        {
            return ($end_work - $start_work) / 3600;
        }
    }
    else
    {
        if($start_work < $start_night && $end_work > $end_night)
        {
            return ($end_night - $start_night) / 3600;
        }
        return 0;
    }
}

var_dump(night_difference(strtotime('today 19:00'),strtotime('tomorrow 05:30')));
var_dump(night_difference(strtotime('today 10:00'),strtotime('today 19:00')));
var_dump(night_difference(strtotime('yesterday 10:00'),strtotime('today 08:00')));
var_dump(night_difference(strtotime('yesterday 23:00'),strtotime('today 04:00')));

outputs:

float(7.5)
int(0)
int(8)
int(5)

Upvotes: 1

Related Questions