10

How can I calculate the number of Saturdays and Sundays between two dates in php?

Is there any inbuilt function for that purpose?

Satish
  • 1,315
  • 4
  • 15
  • 22
  • possible duplicate of [Calculate business days](http://stackoverflow.com/questions/336127/calculate-business-days) – David Yell Jan 14 '14 at 10:45

7 Answers7

5

There is a related question here already, Calculate business days

You can use this to subtract from 7 to get the weekend days, or similar.

Community
  • 1
  • 1
David Yell
  • 11,756
  • 13
  • 61
  • 100
4

I don't think there is a built in for that, but this should do the job :

$startTime = START_TIMESTAMP;
$endTime = END_TIMESTAMP;
$time = $startTime;
$count = 0;

while(date('w', $time) != 0) { // 0 (for Sunday) through 6 (for Saturday)
    $time += 86400;
}

while($time < $endTime) {
    $count++;
    $time += 7 * 86400;
}
Serty Oan
  • 1,737
  • 12
  • 19
2

Let us all KISS (Keep It Simple Stupid). Why make it so complicated?

function countWeekendDays($start, $end)
{
    // $start in timestamp
        // $end in timestamp


    $iter = 24*60*60; // whole day in seconds
    $count = 0; // keep a count of Sats & Suns

    for($i = $start; $i <= $end; $i=$i+$iter)
    {
        if(Date('D',$i) == 'Sat' || Date('D',$i) == 'Sun')
        {
            $count++;
        }
    }
    return $count;
   }
Peter O.
  • 32,158
  • 14
  • 82
  • 96
2

You can calculate it mathematically like this - Based on Roland's Answer

private function getNumberOfWeekendDays(\DateTimeInterface $startDate, \DateTimeInterface $endDate): int
{
    $startNumber = (int) $startDate->format('N');
    $endNumber = (int) $endDate->format('N');
    $daysBetweenStartAndEnd = $endDate->diff($startDate)->d;

    $weekendDays = (int) (2 * ($daysBetweenStartAndEnd + $startNumber) / 7);
    $weekendDays = $weekendDays - ($startNumber == 7 ? 1 : 0) - ($endNumber == 7 ?  1 :  0);

    return $weekendDays;
}
Roland
  • 7,525
  • 13
  • 61
  • 124
Pratyush
  • 1,206
  • 14
  • 13
0

I searched for awhile for a simple solution that worked and decided to write my own and came up with this

        $start = date('Y-m-d');
        $end = date('Y-m-d', strtotime($start.' +1 year'));
        $current = $start;
        $count = 0;

        while($current != $end){
            if(date('l', strtotime($current)) == 'Saturday'){
                $count++;
            }

            $current = date('Y-m-d', strtotime($current.' +1 day'));
        };

        echo $count;
Banning
  • 2,279
  • 2
  • 16
  • 20
0
<?php
date_default_timezone_set("Europe/Lisbon");
$d1 = new DateTime("2009-06-01"); /* inclusive */
$d2 = new DateTime("2009-07-01"); /* exclusive */

$interval = $d2->diff($d1);
$number_of_days = $interval->format("%d");

$number_of_weekends = $number_of_days / 7;
$remainder = $number_of_days % 7;

if ($remainder >=2 && $d1->format("D") == "Sat")
    $number_of_weekends++;
elseif ($d1->format("w") + $remainder >= 8)
    $number_of_weekends++;

I may have missed by one in the last condition, be sure to check it with different starting dates. (Feel free to edit this answer if you spot an error).

Artefacto
  • 96,375
  • 17
  • 202
  • 225
0

there's definitely no built in function for that but you can use strtotime to loop days

$start = strtotime('2010-01-01');
$end = strtotime('2010-01-09');

function numWeekdays( $start_ts, $end_ts, $day, $include_start_end = false ) {

    $day = strtolower( $day );
    $current_ts = $start_ts;
    // loop next $day until timestamp past $end_ts
    while( $current_ts < $end_ts ) {

        if( ( $current_ts = strtotime( 'next '.$day, $current_ts ) ) < $end_ts) {
            $days++;
        }
    }

    // include start/end days
    if ( $include_start_end ) {
        if ( strtolower( date( 'l', $start_ts ) ) == $day ) {
            $days++;
        }
        if ( strtolower( date( 'l', $end_ts ) ) == $day ) {
            $days++;
        }
    }   

    return (int)$days;

}

echo numWeekDays( $start, $end, 'saturday', false );
Galen
  • 29,976
  • 9
  • 71
  • 89