Originariamente inviato da luca200
Occhio.
Se il 1° gennaio è mercoledì o giovedì, il primo martedì dell'anno è nella settimana 2.
siccome non parli mai a vuoto.... mi hai fatto venire un dubbio anzi due. Visto che la serata e' uggiosa faccio qualche prova.

Intanto vorrei precisare che utilizzando quasi esclusivamente mysql per le date mentalmente avevo la presenza di piu' modi di gestire la settimana dell'anno. Il php pare ne abbia uno solo.

Dato questa premessa, credo di capire che le settimane con il php iniziano sempre di lunedi' e possono essere da 1 a 53. Quindi la funzione che ho postato sopra conta i vari martedi' dell'anno partendo da un indice 1 ad un max di 53 senza tener conto della settimana "W" ma in un mero ordine cronologico. Potrebbe quindi dare risultati inattesi a seconda di come viene iniziato a contare la settimana dell'anno interessato.

da un controllo con mktime si trovano alcune collisioni a livello settimana-anno.

esempio:

sett. 01 2007-01-01 Monday
sett. 01 2007-12-31 Monday
sett. 52 2011-01-01 Saturday
sett. 52 2011-12-31 Saturday

e poi, l'inizio anno da Monday a Thursday e' sempre sett. 01 mentre
Friday, Saturday e Sunday sono sempre settimana 52 o 53 dell'anno precedente:

Sett. 01 2003-01-01 Wednesday
Sett. 01 2009-01-01 Thursday
Sett. 53 2010-01-01 Friday
Sett. 52 2011-01-01 Saturday
Sett. 52 2012-01-01 Sunday

Quindi se il mese di gennaio di un qualsiasi anno inizia di Lunedi', martedi', mercoledi', giovedi' sara' la settimana 01 dell'anno corrente, mentre se inzia di venerdi', sabato o domenica questi giorni apparterranno all'ultima settimana dell'anno precedente.

Dato questo postulato lo switch per la ricerca del martedi' di una qualsiasi settimana dell'anno deve essere rivisto e sostituito con questo che segue:

Codice PHP:
// calcolo il valore del martedi' della settimana 01
if($w == 0) { $z 3;  }                // domenica
   
elseif($w == 1) { $z 2; }          // lunedi'
      
elseif($w == 2) { $z 1;  }      // martedi'
        
elseif($w == 3) { $z = -1; }    // mercoledi'
           
elseif($w == 4) { $z = -2; } // giovedi
               
else { $z 10 $w; }    // venerdi e sabato 
fermo restando tutto il resto. La collisione possibile di due valori "settimana" identici ad inizio e fine anno con questa funzione non dovrebbe causare equivoci.