Calcul d'une date à partir du numéro de la semaine.

Après une question sur le forum PHPIndex, j'ai trouvé intéressant d'en faire un truc et astuce.

Il faut tout d'abord partir d'une date, exemple le 1 janvier de l'année en court.

Donc pour la 14 eme semaine de l'année 2001, on part du 01 janvier 2001. Ensuite, on crée un mktime() en ajoutant au jour du 01 janvier le nombre de jours pour arriver au même jour de la semaine mais 14 semaines plus tard,
soit :

$mon_mktime = mktime (0,0,0,01,(01+(14*7)),2001);
De plus, la semaine 1 commence le premier lundi du mois de janvier de l'année.
Donc si le premier janvier est un lundi on a :

$mon_mktime = mktime (0,0,0,01,(01+(13*7)),2001);
Sinon on a :

$mon_mktime = mktime (0,0,0,01,(01+(14*7)),2001);
On a donc un mktime d'un jour de la 14 ème semaine 2001. Pour avoir le lundi de cette semaine, on utilise la fonction date("w",$mon_mktime) ce qui nous donne le décalage par rapport au dimanche précédent. Il nous faut ce décalage en seconde :

$decalage = ((date("w",$mon_mktime)-1)*60*60*24);
Mais ce décalage n'est valable que si le jour de la semaine est supérieur au lundi Dimanche exclus.

Le mktime du lundi est donc le suivant :

$lundi = $mon_mktime - $decalage;
On en déduit le dimanche :

$dimanche = $lundi + (6*60*60*24);
On peut donc afficher la date du lundi et du dimanche avec la fonction date().

print date("D - d/m/Y",$lundi);
print date("D - d/m/Y",$dimanche);
Le paramètre 'D' affiche le Jour de la semaine, pour vérifier si c'est bien un lundi.

Il n'y a plus qu'a créer notre fonction :

<?
function get_lundi_dimanche_from_week($week,$year)
{
 if(strftime("%W",mktime(0,0,0,01,01,$year))==1)
  $mon_mktime = mktime(0,0,0,01,(01+(($week-1)*7)),$year);
 else
  $mon_mktime = mktime(0,0,0,01,(01+(($week)*7)),$year);

 if(date("w",$mon_mktime)>1)
  $decalage = ((date("w",$mon_mktime)-1)*60*60*24);

 $lundi = $mon_mktime - $decalage;
    $dimanche = $lundi + (6*60*60*24);

    return array(date("D - d/m/Y",$lundi),date("D - d/m/Y",$dimanche));
}

$tmp = get_lundi_dimanche_from_week($week,$year);
print $tmp[0]."<BR>"; // date du lundi
print $tmp[1]."<BR>"; // date du mardi
?>
Voici résultat pour la semaine 14 de l'année 2001 :
Mon - 02/04/2001
Sun - 08/04/2001
Dans la fonction on pourrait tester la validité de la réponse avec cette ligne :
echo strftime("%W",$lundi)."<BR>";
Dans ce cas elle renvoit bien 14.

Consulter le lien