Calcul du numéro de la semaine

Soyez le premier à donner votre avis sur cette source.

Snippet vu 30 187 fois - Téléchargée 30 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

Messages postés
2
Date d'inscription
mercredi 13 septembre 2006
Statut
Membre
Dernière intervention
19 novembre 2008

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);
Messages postés
2
Date d'inscription
mercredi 13 septembre 2006
Statut
Membre
Dernière intervention
19 novembre 2008

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 ?
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
salut,
ton code n'est pas compatible avec FireFox2 apparemment

js n'est pas mon fort, aurais-tu une piste de recherche stp?
merci
Messages postés
115
Date d'inscription
jeudi 8 mai 2003
Statut
Membre
Dernière intervention
3 janvier 2016

mais de rien. et surtout merci à Gagou9 d'avoir répondu si vite ;)
Messages postés
2
Date d'inscription
mardi 7 décembre 2004
Statut
Membre
Dernière intervention
29 janvier 2007

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.