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;
}