function date_to_weeknum($date) { // cette fonction calcule à partir d'une date le numéro de semaine associé // "la premiere semaine de l'année est celle dans laquelle se trouve le premier jeudi de l'année" $tmp_date = mktime(0,0,0,01,01,date("Y",$date)); // initialisation de la date de départ du calcul // initialisation au premier lundi de l'année // indique au passage si ce lundi appartient à la semaine 1 ou 2 de l'année switch(date("w",$tmp_date)) { case 1: $tmp_date = mktime(0,0,0,01,01,date("Y",$date)); $tmp_delta_week = 0; break; case 0: $tmp_date = mktime(0,0,0,01,02,date("Y",$date)); $tmp_delta_week = 0; break; case 6: $tmp_date = mktime(0,0,0,01,03,date("Y",$date)); $tmp_delta_week = 0; break; case 5: $tmp_date = mktime(0,0,0,01,04,date("Y",$date)); $tmp_delta_week = 0; break; case 4: $tmp_date = mktime(0,0,0,01,05,date("Y",$date)); $tmp_delta_week = 1; break; case 3: $tmp_date = mktime(0,0,0,01,06,date("Y",$date)); $tmp_delta_week = 1; break; case 2: $tmp_date = mktime(0,0,0,01,07,date("Y",$date)); $tmp_delta_week = 1; break; } if ($date >= $tmp_date) { // si la date recherchée est postérieure au premier lundi de l'année // nombre de jours écoulés depuis la date de début du calcul $tmp_nbjours = date("z",mktime(0,0,0,date("m",$date),date("d",$date),date("Y",$date)))-date("z",mktime(0,0,0,date("m",$tmp_date),date("d",$tmp_date),date("Y",$tmp_date))); // nombre de semaines écoulées $tmp_numsem = floor($tmp_nbjours/7)+$tmp_delta_week+1; if ($tmp_numsem < 10) { $tmp_numsem = "0".$tmp_numsem; } // mise en forme du nombre de semaines if ($tmp_numsem == 53) { // si on a trouvé la semainhe n°53 : attention au piège : n'est-ce pas une semaine 1 anticipée ? //echo( date("d-m-Y",mktime(0,0,0,date("m",$date),date("d",$date)+delta_to_thursdaysameweek($date),date("Y",$date)))." || ".date("d-m-Y",mktime(0,0,0,01,01,date("Y",$date)+1))); if ( date("Y",mktime(0,0,0,date("m",$date),date("d",$date)+delta_to_thursdaysameweek($date),date("Y",$date))) == date("Y",mktime(0,0,0,01,01,date("Y",$date)+1)) ) { // si le jeudi de cette semaine tombe l'année prochaine alors on est en semaine 1 return "01"; } else { // si le jeudi de cette semaine tombe cette année alors on est en semaine 53 return "53"; } } else { // si on est en semaine 1 à 52, ok. return $tmp_numsem; } } else { // si la date recherchée est antérieure au premier lundi de l'année if ($tmp_delta_week == 1) { // si on avait noté une semaine de décalage, les jours antérieurs au premier lundi sont tous en semaine 1 return "01"; } else { // si on n'avait pas noté de semaine de décalage, les jours antérieurs au premier lundi sont tous de la meme semaine que la dernière semaine de l'année d'avant. return date_to_weeknum(mktime(0,0,0,12,31,date("Y",$date)-1)); } } } function date_to_weekyear($date) { // cette fonction calcule à partir d'une date le numéro de semaine associé // "la premiere semaine de l'année est celle dans laquelle se trouve le premier jeudi de l'année" // l'année de la semaine de la date en cours est l'année du jeudi de la semaine de la date en cours return date("Y",mktime(0,0,0,date("m",$date),date("d",$date)+delta_to_thursdaysameweek($date),date("Y",$date))); } function delta_to_thursdaysameweek($date) { if (date("w",$date)==0) { return -3; } else { return 4-date("w",$date); } } function numweek_to_date($numweek,$year,$dayOfWeek) { // cette fonction calcule à partir d'un numéro de semaine, d'une année et d'un jour de semaine la date associée. $tmp_date = mktime(0,0,0,01,01,$year); // si les paramètres sont mal formatés, la fonction renvoie false if (is_nan($numweek) || is_nan($year) || is_nan ($dayOfWeek) || $numweek > 53 || $numweek < 0 || $dayOfWeek < 0 || $dayOfWeek > 6 || $year <1970 || $year>2030) { return false; exit; } // initialisation de la date de départ du calcul // initialisation au premier lundi de l'année // indique au passage si ce lundi appartient à la semaine 1 ou 2 de l'année switch(date("w",$tmp_date)) { case 1: $tmp_date = mktime(0,0,0,01,01,$year); $tmp_delta_week = 0; break; case 0: $tmp_date = mktime(0,0,0,01,02,$year); $tmp_delta_week = 0; break; case 6: $tmp_date = mktime(0,0,0,01,03,$year); $tmp_delta_week = 0; break; case 5: $tmp_date = mktime(0,0,0,01,04,$year); $tmp_delta_week = 0; break; case 4: $tmp_date = mktime(0,0,0,01,05,$year); $tmp_delta_week = 1; break; case 3: $tmp_date = mktime(0,0,0,01,06,$year); $tmp_delta_week = 1; break; case 2: $tmp_date = mktime(0,0,0,01,07,$year); $tmp_delta_week = 1; break; } if ($dayOfWeek>=1 && $dayOfWeek<=6) { $tmp_delta_day = $dayOfWeek -1; } elseif ($dayOfWeek==0) { $tmp_delta_day = 6; } $tmp_date = mktime(0,0,0,date("m",$tmp_date),date("d",$tmp_date)+($numweek-1-$tmp_delta_week)*7 + $tmp_delta_day,date("Y",$tmp_date)); //$tmp_date = date("d m Y",$tmp_date); // en cas de semaine 53, on vérifie que la semaine 53 existe en effet, sinon on renvoie false if ($numweek==53) { if (numweek_to_date(01,$year+1,$dayOfWeek)==$tmp_date) { //$tmp_date = false; $tmp_date = numweek_to_date(52,$year,$dayOfWeek); } } return $tmp_date; }