Numero de la semaine

Contenu du snippet

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.

A voir également

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.