开发者

Calculating the number of Saturdays and Sundays

How can I ca开发者_开发问答lculate the number of Saturdays and Sundays between two dates in php?

Is there any inbuilt function for that purpose?


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.


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


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


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


<?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).


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


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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜