timber.km
timber.km

Reputation: 126

Carbon list of weeks in year

I have function of return weeks in year:

function getWeek(){

    $today = \Carbon\Carbon::today();
    $date = $today->copy()->firstOfYear()->startOfDay();
    $eom = $today->copy()->endOfYear()->startOfDay();
  
    $dates = [];

    for($i = 1; $date->lte($eom); $i++){
        $startDate = $date->copy();
        while($date->dayOfWeek != \Carbon\Carbon::SUNDAY && $date->lte($eom)){
                $date->addDay(); 
            }
        
        $dates['w'.$i] = $startDate->format('d/m/Y') . ' - ' . $date->format('d/m/Y');
        $date->addDay();
    }
    
    return $dates;
}

And the function return 53 weeks in year 2022 but in 2022 is 52 weeks. This is a result of return $dates

enter image description here

How to change the function to return first position to return full dates of week (27/12/2021 - 02/01/2022) and the same at the last position in year

Upvotes: 0

Views: 2851

Answers (2)

jspit
jspit

Reputation: 7703

This solution always shows the complete weeks. Uses the ISO 8601 week number. Only DateTime is required. The year was added for the key so that they are always unique.

$year = date_create('today')->format('Y');
//remove comment next line for test's
//$year = 2001;

$dtStart = date_create('2 jan '.$year)->modify('last Monday');
$dtEnd = date_create('last monday of Dec '.$year);

for($weeks = [];$dtStart <= $dtEnd;$dtStart->modify('+1 week')){
  $key = $dtStart->format('W-Y');
  $from = $dtStart->format('d/m/Y');
  $to = (clone $dtStart)->modify('+6 Days')->format('d/m/Y');
  $weeks[$key] = $from.' - '.$to;
}

var_export($weeks);

Since carbon is not required, you can also test it here.

Upvotes: 1

poppies
poppies

Reputation: 120

I think you are mistaken.

w1->w53 = 52 weeks

Upvotes: 1

Related Questions