gaurav malik
gaurav malik

Reputation: 742

find cout of specific day between two date php without using any loop?

I need to find out count of a specific Day between two date. I can do this by using loop between two date, but if there is difference of 10 years(suppose) between date loop will run 10*365 times. Is any easier way to do this?
Thanks in advance

Upvotes: 2

Views: 374

Answers (3)

arsh
arsh

Reputation: 1258

function countSpecificDayInRange($from,$to,$day){
   $date1 = new DateTime($from);
   $date2 = new DateTime($to);
   $date1->modify('-1 day');
   $date1->modify('next '.$day);
   if ($date1 > $date2) {
      return 0;
   }
   $diff = $date1->diff($date2)->days;
   return floor($diff/7)+1;
}

echo countSpecificDayInRange('2024-11-01','2024-12-31','Saturday');

Upvotes: 0

Amiya Ranjan
Amiya Ranjan

Reputation: 177

function countDays($day, $start, $end) {

$start = strtotime($start);
$end = strtotime($end);
$datediff = $end - $start;

$days =  floor($datediff / (60 * 60 * 24));


//get the day of the week for start and end dates (0-6)
$w = array( date('w', $start ), date('w', $end) );

//get partial week day count
if ($w[0] < $w[1])
{            
    $partialWeekCount = ($day >= $w[0] && $day <= $w[1]);
}else if ($w[0] == $w[1])
{
    $partialWeekCount = $w[0] == $day;
}else
{
    $partialWeekCount = ($day >= $w[0] 
    $day <= $w[1]); 
} 
//first count the number of complete weeks, then add 1 if $day falls in a partial week. 
return intval($days / 7) + $partialWeekCount; 

}

Function Call - countDays( 5, "2017-04-14", "2017-04-21")

Upvotes: 2

Rakesh Shewale
Rakesh Shewale

Reputation: 507

You are looking for date_diff() function. The date_diff() function returns the difference between two DateTime objects.

<?php
$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
echo $diff->format("%R%a days");
?>

To find occurrence of specific day (for eg: Sunday). Please note: I have used 7 for Sunday. You can use 1 for Monday, 2 for Tuesday and so on

$cnt  = 0;
$start = new DateTime("2013-03-15");
$end   = new DateTime("2013-12-12");
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $dt)
{
    if ($dt->format('N') == 7)
    {
        $cnt++;
    }
}
echo $cnt;

Upvotes: 0

Related Questions