php / web-php

The www.php.net site
http://www.php.net
Other
816 stars 524 forks source link

Problem with format('W') #894

Closed jpm04021 closed 6 months ago

jpm04021 commented 6 months ago

// Note: this function should be using / reporting on the 1st day of the week when generating the week #, instead of the // 2nd day of the week $tdate = '2023-12-10'; $date = new DateTime( $tdate ); $week = $date->format('W'); echo "$tdate - Week Number: " . (int) $week . '
';

// The format('W') function works OK for dates thru 2027-01-02 // However, on date 2027-01-03 and on, this function repeats week 1 again (and it loses 1 week going forward)

rlerdorf commented 6 months ago

Looks fine to me. As per the docs, weeks start on a Monday, so everything up until the first Monday of a year will be in the last week of the previous year:

<?php                                                                                                                                                                                                   
$date = new DateTime('noon Dec 24, 2026');                                                                                                                                                              
$days = 21;                                                                                                                                                                                             
while($days--) {                                                                                                                                                                                        
    $date->modify('+1 day');                                                                                                                                                                            
    $tdate = $date->format('H:i D M d, Y');                                                                                                                                                             
    $week = $date->format('W');                                                                                                                                                                         
    echo "$tdate - Week Number: " . (int) $week . "\n";                                                                                                                                                 
}

Output:

12:00 Fri Dec 25, 2026 - Week Number: 52
12:00 Sat Dec 26, 2026 - Week Number: 52
12:00 Sun Dec 27, 2026 - Week Number: 52
12:00 Mon Dec 28, 2026 - Week Number: 53
12:00 Tue Dec 29, 2026 - Week Number: 53
12:00 Wed Dec 30, 2026 - Week Number: 53
12:00 Thu Dec 31, 2026 - Week Number: 53
12:00 Fri Jan 01, 2027 - Week Number: 53
12:00 Sat Jan 02, 2027 - Week Number: 53
12:00 Sun Jan 03, 2027 - Week Number: 53
12:00 Mon Jan 04, 2027 - Week Number: 1
12:00 Tue Jan 05, 2027 - Week Number: 1
12:00 Wed Jan 06, 2027 - Week Number: 1
12:00 Thu Jan 07, 2027 - Week Number: 1
12:00 Fri Jan 08, 2027 - Week Number: 1
12:00 Sat Jan 09, 2027 - Week Number: 1
12:00 Sun Jan 10, 2027 - Week Number: 1
12:00 Mon Jan 11, 2027 - Week Number: 2
12:00 Tue Jan 12, 2027 - Week Number: 2
12:00 Wed Jan 13, 2027 - Week Number: 2
12:00 Thu Jan 14, 2027 - Week Number: 2