Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP days difference calculation error

Tags:

date

php

php-5.3

I have some PHP code to calculate the number of days between two specific dates. The difference should not count Sundays and Saturdays. Also, I have an array of dates, which includes holidays, which also need to be skipped.

I gave the starting date as 01-05-2015 and ending date as 01-06-2015. I gave the entire days in the month of may as array. Thus the difference should be 1 day. But I am getting the output as 7. What is the problem? Here is the code.

function dateRange($first, $last) {
    $dates = array();
    $current = strtotime($first);
    $now = $current;
    $last = strtotime($last);
    while( $current <= $last ) {
        if (date('w', $current) != 0){
            $dates[] = date('d-m-Y', $current);
        }
        $current = strtotime('+1 day', $current);
    }
    unset($dates[0]);
    return $dates;
}


$datea = "01-05-2015";
$date = "01-06-2015";
$hdsarray = array("1-05-2015","2-05-2015","4-05-2015","5-05-2015","7-05-2015","8-05-2015","9-05-2015","11-05-2015","12-05-2015","14-05-2015","15-05-2015","16-05-2015","18-05-2015","19-05-2015","21-05-2015","22-05-2015","23-05-2015","25-05-2015","26-05-2015","28-05-2015","29-05-2015","30-05-2015");

$datesarray = dateRange($datea, $date);
$result = array_diff($hdsarray,$datesarray);
$date_diff = sizeof($result);

echo $date_diff;
like image 356
Alfred Avatar asked Jun 09 '15 08:06

Alfred


1 Answers

The only problem I can see is in the usage of array_diff, It actually includes the sat and sun which is excluded by dateRange function, if not found in holidays list.

Instead, you can pass your holiday dates in dateRange function, and filter over there.

function dateRange($first, $last, $excludeDates) {
    $dates = array();
    $current = strtotime($first);
    $now = $current;
    $last = strtotime($last);
    while( $current <= $last ) {
        if (date('w', $current) != 0 && date('w', $current) != 6 && !in_array(date('j-m-Y', $current), $excludeDates)){
            $dates[] = date('d-m-Y', $current);
        }
        $current = strtotime('+1 day', $current);
    }
    return $dates;
}

$datea = "01-05-2015";
$date = "01-06-2015";
$hdsarray = array("1-05-2015","2-05-2015","4-05-2015","5-05-2015","7-05-2015","8-05-2015","9-05-2015","11-05-2015","12-05-2015","14-05-2015","15-05-2015","16-05-2015","18-05-2015","19-05-2015","21-05-2015","22-05-2015","23-05-2015","25-05-2015","26-05-2015","28-05-2015","29-05-2015","30-05-2015");
$datesarray = dateRange($datea, $date, $hdsarray);print_r($datesarray);

Result:

Array
(
    [0] => 06-05-2015
    [1] => 13-05-2015
    [2] => 20-05-2015
    [3] => 27-05-2015
    [4] => 01-06-2015
)

All the 5 dates come in the result, are not sat, sun, and also not there in holidays list.

like image 115
kamal pal Avatar answered Oct 08 '22 15:10

kamal pal