5

I am trying to get the start date and end dates of all weeks between two week numbers.

That is one of my date is 2014-05-17 and its week number is 20 and other date is 2014-08-13 and its week number is 33. My task is to get start and end dates of all weeks between 20 and 33. Here Sunday is the week start and Saturday week end.

$signupweek='2014-05-17';
$signupweek=date("W",strtotime($signupdate));

//week number of current date.
$weekNumber = date("W");

Can anyone help to find the dates.

Aishwaryas
  • 633
  • 2
  • 18
  • 44
  • Seems like a challenge for good programmers out there. – kimbarcelona Aug 13 '14 at 04:38
  • possible duplicate of [PHP get start and end date of a week by weeknumber](http://stackoverflow.com/questions/4861384/php-get-start-and-end-date-of-a-week-by-weeknumber) – scrowler Aug 13 '14 at 04:40

5 Answers5

12

try this

$signupdate='2014-05-17';
$signupweek=date("W",strtotime($signupdate));
$year=date("Y",strtotime($signupdate));
$currentweek = date("W");

for($i=$signupweek;$i<=$currentweek;$i++) {
    $result=getWeek($i,$year);
    echo "Week:".$i." Start date:".$result['start']." End date:".$result['end']."<br>";
}

function getWeek($week, $year) {
  $dto = new DateTime();
  $result['start'] = $dto->setISODate($year, $week, 0)->format('Y-m-d');
  $result['end'] = $dto->setISODate($year, $week, 6)->format('Y-m-d');
  return $result;
}

Output

Week:20 Start date:2014-05-11 End date:2014-05-17
Week:21 Start date:2014-05-18 End date:2014-05-24
Week:22 Start date:2014-05-25 End date:2014-05-31
Week:23 Start date:2014-06-01 End date:2014-06-07
Week:24 Start date:2014-06-08 End date:2014-06-14
Week:25 Start date:2014-06-15 End date:2014-06-21
Week:26 Start date:2014-06-22 End date:2014-06-28
Week:27 Start date:2014-06-29 End date:2014-07-05
Week:28 Start date:2014-07-06 End date:2014-07-12
Week:29 Start date:2014-07-13 End date:2014-07-19
Week:30 Start date:2014-07-20 End date:2014-07-26
Week:31 Start date:2014-07-27 End date:2014-08-02
Week:32 Start date:2014-08-03 End date:2014-08-09
Week:33 Start date:2014-08-10 End date:2014-08-16
noufalcep
  • 3,446
  • 15
  • 33
  • 51
3

Another method...

If you have a date, from that date you can find the start date and end date of that week. But here week number is not used.

For example:

You have a date 2014-08-13, then required start date is 2014-08-10 and end date is 2014-08-16.

PHP code is

   $signupweek='2014-8-13';
/*start day*/
    for($i = 0; $i <7 ; $i++)
    {
     $date = date('Y-m-d', strtotime("-".$i."days", strtotime($signupweek)));
     $dayName = date('D', strtotime($date));
     if($dayName == "Sun")
     {
       echo "start day is ". $date."<br>";
     }
    }
/*end day*/
 for($i = 0; $i <7 ; $i++)
    {
     $date = date('Y-m-d', strtotime("+".$i."days", strtotime($signupweek)));
     $dayName = date('D', strtotime($date));
     if($dayName == "Sat")
     {
       echo "end day is ". $date."<br>";
     }
    }

OUTPUT

start day is 2014-08-10
end day is 2014-08-16

Hope this is useful..

Deepu Sasidharan
  • 5,193
  • 10
  • 40
  • 97
0

Here's an example that implements the function from this answer:

$signupweek = '2014-05-17';
$signupweek = date("W", strtotime($signupweek));

$current_week = date('W');

$output = array();
// Loop through the weeks BETWEEN your given weeks
// to include the start and end week, remove the +1 below and make 
// it $i <= $current_week
for($i = $signupweek + 1; $i < $current_week; $i++) {
    // Get the start and end for the current week ($i)
    $dates = getStartAndEndDate($i, '2014');
    // if the start or end of the week is greater than now, skip it
    if(strtotime($dates['start']) > time() or strtotime($dates['end']) > time())
        continue;
    // Add to output array
    $output[] = $dates;
}

function getStartAndEndDate($week, $year)
{

    $time = strtotime("1 January $year", time());
    $day = date('w', $time);
    $time += ((7 * $week) + 1 - $day) * 24 * 3600;
    $return['start'] = date('Y-n-j', $time);
    $time += 6 * 24 * 3600;
    $return['end'] = date('Y-n-j', $time);
    return $return;
}

Output

Community
  • 1
  • 1
scrowler
  • 24,273
  • 9
  • 60
  • 92
0

Try this:

$startTime = "2014-05-17";
$startWeek = 20;
$endWeek = 33;

for ($i = 0; $i <= ($endWeek - $startWeek); $i++) {
    $days = $i * 7;
    echo date("Y-m-d", strtotime($startTime . "+$days day")).'<br />';
}

Unfortunately, it seems that 2014-08-13 is not the start of week 33. 2014-08-16 is.

chrisbjr
  • 628
  • 4
  • 10
0

You can now use DateTime to get start/end dates of week(s)

function getDateRangeForAllWeeks($start, $end){
    $fweek = getDateRangeForWeek($start);
    $lweek = getDateRangeForWeek($end);
    $week_dates = [];
    while($fweek['sunday']!=$lweek['sunday']){
        $week_dates [] = $fweek;
        $date = new DateTime($fweek['sunday']);
        $date->modify('next day');

        $fweek = getDateRangeForWeek($date->format("Y-m-d"));
    }
    $week_dates [] = $lweek;

    return $week_dates;
}

function getDateRangeForWeek($date){
    $dateTime = new DateTime($date);
    $monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
    $sunday = clone $dateTime->modify('Sunday this week'); 
    return ['monday'=>$monday->format("Y-m-d"), 'sunday'=>$sunday->format("Y-m-d")];
}

print_r( getDateRangeForWeek("2016-05-07") );

print_r( getDateRangeForAllWeeks("2015-11-07", "2016-02-15") );
Waqas
  • 714
  • 5
  • 13