Calcul du numéro de la semaine

0/5 (13 avis)

Snippet vu 31 118 fois - Téléchargée 32 fois

Contenu du snippet

Voilà un petit code qui permet de calculer le numéro de la semaine pour une date donnée.

Source / Exemple :


<html><head>
<script langage="JavaScript"> 
document.writeln(new Date() + " --> " + getWeek ( new Date() ));
document.writeln("<BR>");
document.writeln("01/01/2005 --> " + getWeek ( new Date(2005, 0, 1) )) ;
document.writeln("<BR>");
document.writeln("01/01/2004 --> " + getWeek ( new Date(2004, 0, 1) )) ;
document.writeln("<BR>");
document.writeln("31/12/2004 --> " + getWeek ( new Date(2004, 11, 31) )) ;
document.writeln("<BR>");
document.writeln("01/01/2007 --> " + getWeek ( new Date(2007, 0, 1) )) ;
document.writeln("<BR>");
document.writeln("08/01/2007 --> " + getWeek ( new Date(2007, 0, 8) )) ;
document.writeln("<BR>");
document.writeln("10/01/2005 --> " + getWeek ( new Date(2005, 0, 10) )) ;
document.writeln("<BR>");
document.writeln("29/12/2003 --> " + getWeek ( new Date(2003, 11, 29) )) ;

function getWeek ( tDate ) {
  var res = '' ;

  //de l'année courante
  var janv1 = new Date ( tDate.getYear(), 0, 1 ) ;  //1 janvier
  var dec31 = new Date ( tDate.getYear(), 11, 31 ) ;  //31 decembre
  var janv1Num = janv1.getDay() == 0 ? 7 : janv1.getDay() ; //numero du 1 janvier
  var premSem = 7 - janv1Num > 2 ? true : false ;  //si la première semaine compte ou pas
  var premLundi = 9 - janv1Num ; //date du premier lundi suivant le 1 janvier
  //nb jour separant la date du 1 janvier
  var nbJour = parseInt((tDate - janv1) / (60 * 60 * 24 * 1000) + 1, 10) ;
  //nb jour dans l'annee
  var nbJourTot = parseInt((dec31 - janv1) / (60 * 60 * 24 * 1000) + 1, 10) ;
  //nombre de semaines dans l'annee
  var nbSem ;
  if (janv1Num == 4 || (janv1Num == 3 && nbJourTot == 366)) { nbSem = 53 ; }
  else { nbSem = 52 ; }

  //de l'année précédente
  var janv1Prev = new Date ( tDate.getYear()-1, 0, 1 ) ;  //1 janvier
  var dec31Prev = new Date ( tDate.getYear()-1, 11, 31 ) ;  //31 decembre
  var janv1NumPrev = janv1Prev.getDay() == 0 ? 7 : janv1Prev.getDay() ;  //numero du 1 janvier
  //nb jour dans l'annee
  var nbJourTotPrev = parseInt((dec31Prev - janv1Prev) / (60 * 60 * 24 * 1000) + 1, 10) ;
  //nombre de semaines dans l'annee
  var nbSemPrev ;
  if (janv1NumPrev == 4 || (janv1NumPrev == 3 && nbJourTotPrev == 366)) { nbSemPrev = 53 ; }
  else { nbSemPrev = 52 ; }

  //calcul de la semaine
  var nbSemCompl = parseInt((nbJour - premLundi) / 7 , 10) ;

  var week = premSem + nbSemCompl + 1 ;

  if (nbJour < premLundi) {
    if (premSem) {
      res = '01/' + tDate.getYear() ;
    }
    else {
      res = nbSemPrev + '/' + (tDate.getYear()-1) ;
    }
  }
  else {
    if ((week > 52) && (week > nbSem)) {
      res = '01/' + (tDate.getYear()+1) ;
    }
    else {
      var tmp = '0' + week ;
      res = tmp.substring(tmp.length-2, tmp.length) + '/' + tDate.getYear() ;
    }
  }

  return (res) ;
}

</script> 
</head></html>

Conclusion :


S'il y a des bugs n'hesitez pas

A voir également

Ajouter un commentaire Commentaires
Wildok Messages postés 2 Date d'inscription mercredi 13 septembre 2006 Statut Membre Dernière intervention 19 novembre 2008
19 nov. 2008 à 16:28
Cela semblerais qu'a partir d'une certaine date (en Mars), le calcul du nbJour donne du XX.9583333 ..... et l'arondi doit se faire au supérieur et pas l'inférieur :

Remplacer :
var nbJour = parseInt( (tDate - janv1) / (60 * 60 * 24 * 1000) + 1, 10) ;
Par :
var nbJour = Math.ceil( ( (tDate - janv1) / 86400000) + 1);
Wildok Messages postés 2 Date d'inscription mercredi 13 septembre 2006 Statut Membre Dernière intervention 19 novembre 2008
19 nov. 2008 à 15:40
Je crois qu'il y a un Bug pour 1 Lundi du mois de Mars qui fait partie de la semaine précédente ... et aprés tous les lundi font partie de la semaine précédente :

Exemple :
dimanche 25-03-2029 <-> 12/2029

lundi 26-03-2029 <-> 12/2029 au lieu de 13
mardi 27-03-2029 <-> 13/2029
mercredi 28-03-2029 <-> 13/2029
jeudi 29-03-2029 <-> 13/2029
vendredi 30-03-2029 <-> 13/2029
samedi 31-03-2029 <-> 13/2029
dimanche 01-04-2029 <-> 13/2029

lundi 02-04-2029 <-> 13/2029 au lieu de 14

J'espère me tromper qq part ... peux tu vérifier ?
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
2 juil. 2007 à 21:53
salut,
ton code n'est pas compatible avec FireFox2 apparemment

js n'est pas mon fort, aurais-tu une piste de recherche stp?
merci
cs_jerms Messages postés 115 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 3 janvier 2016
29 janv. 2007 à 19:32
mais de rien. et surtout merci à Gagou9 d'avoir répondu si vite ;)
cs_StanTheFlasher Messages postés 2 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 29 janvier 2007
29 janv. 2007 à 19:13
Merci beaucoup!
En fait j'ai pu intégrer ce super code dans mes pages d'emploi du temps et cela va me permettre d'afficher l'emploi du temps de la semaine en cours sans avoir à modifier chaque lundi le lien vers la semaine en cours.

Je cherchais cette solution depuis des années (je suis un boulet et je n'ai pas le droit d'utiliser php dans ma boîte) et grâce à vous, j'ai enfin trouvé la solution.

Vraiment mille mercis!
Afficher les 13 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.