Trois méthodes pour l'objet Date, une pour connaître le numéro du jour dans l'année, une pour obtenir le lundi de la semaine d'une date et une (qui utilise les deux autres =) pour calculer le numéro de la semaine.
Source / Exemple :
Date.prototype.getYearDay = function() { //1 - 366
var year = this.getFullYear();
var month = this.getMonth();
var day = this.getDate();
var offset = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
//l'année bissextile n'est utile qu'à partir de mars
var bissextile = (month < 2) ? 0 : (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0));
return parseInt(day + offset[month] + bissextile);
}
Date.prototype.getMonday = function() {
var offset = (this.getDay() + 6) % 7;
return new Date(this.getFullYear(), this.getMonth(), this.getDate()-offset);
}
Date.prototype.getWeek = function() { //1 - 53
var year = this.getFullYear();
var week;
//dernier lundi de l'année
var lastMonday = new Date(year, 11, 31).getMonday();
//la date est dans la dernière semaine de l'année
//mais cette semaine fait partie de l'année suivante
if(this >= lastMonday && lastMonday.getDate() > 28) {
week = 1;
}
else {
//premier lundi de l'année
var firstMonday = new Date(year, 0, 1).getMonday();
//correction si nécessaire (le lundi se situe l'année précédente)
if(firstMonday.getFullYear() < year) firstMonday = new Date(year, 0, 8).getMonday();
//nombre de jours écoulés depuis le premier lundi
var days = this.getYearDay() - firstMonday.getYearDay();
//window.alert(days);
//si le nombre de jours est négatif on va chercher
//la dernière semaine de l'année précédente (52 ou 53)
if(days < 0) {
week = new Date(year, this.getMonth(), this.getDate()+days).getWeek();
}
else {
//numéro de la semaine
week = 1 + parseInt(days / 7);
//on ajoute une semaine si la première semaine
//de l'année ne fait pas partie de l'année précédente
week += (new Date(year-1, 11, 31).getMonday().getDate() > 28);
}
}
return parseInt(week);
}
//2 janvier 2005 : semaine 53 (ISO 8601)
window.alert( new Date(2005, 0, 2).getWeek() );
Conclusion :
Dans une année il peut y avoir une 53e semaine, le script prend en compte toutes ces possibilités, et surtout il reste simple (j'ai trouvé que des trucs compliqués et pas toujours valides) alors je me suis attelé à la tâche...
J'ai testé avec en gros les début, milieu et fin d'année de 2000 à 2010 donc en théorie y'a pas de bug.
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.