All pastes #73974 Raw Edit

Miscellany

public text v1 · immutable
#73974 ·published 2006-06-28 14:33 UTC
rendered paste body
function date_to_weeknum($date) {
	// cette fonction calcule à partir d'une date le numéro de semaine associé
	// "la premiere semaine de l'année est celle dans laquelle se trouve le premier jeudi de l'année"
	$tmp_date = mktime(0,0,0,01,01,date("Y",$date));
	
	// initialisation de la date de départ du calcul
	// initialisation au premier lundi de l'année
	// indique au passage si ce lundi appartient à la semaine 1 ou 2 de l'année
	switch(date("w",$tmp_date)) {
		case 1:
			$tmp_date = mktime(0,0,0,01,01,date("Y",$date));
			$tmp_delta_week = 0;
			break;
		case 0:
			$tmp_date = mktime(0,0,0,01,02,date("Y",$date));
			$tmp_delta_week = 0;
			break;
		case 6:
			$tmp_date = mktime(0,0,0,01,03,date("Y",$date));
			$tmp_delta_week = 0;
			break;
		case 5:
			$tmp_date = mktime(0,0,0,01,04,date("Y",$date));
			$tmp_delta_week = 0;
			break;
		case 4:
			$tmp_date = mktime(0,0,0,01,05,date("Y",$date));
			$tmp_delta_week = 1;
			break;
		case 3:
			$tmp_date = mktime(0,0,0,01,06,date("Y",$date));
			$tmp_delta_week = 1;
			break;
		case 2:
			$tmp_date = mktime(0,0,0,01,07,date("Y",$date));
			$tmp_delta_week = 1;
			break;
	}
	
	if ($date >= $tmp_date) { 	// si la date recherchée est postérieure au premier lundi de l'année
		
		// nombre de jours écoulés depuis la date de début du calcul
		$tmp_nbjours = date("z",mktime(0,0,0,date("m",$date),date("d",$date),date("Y",$date)))-date("z",mktime(0,0,0,date("m",$tmp_date),date("d",$tmp_date),date("Y",$tmp_date)));
		
		// nombre de semaines écoulées
		$tmp_numsem = floor($tmp_nbjours/7)+$tmp_delta_week+1;
		if ($tmp_numsem < 10) { $tmp_numsem = "0".$tmp_numsem; } // mise en forme du nombre de semaines
		
		if ($tmp_numsem == 53) { 	// si on a trouvé la semainhe n°53 : attention au piège : n'est-ce pas une semaine 1 anticipée ?
			//echo( date("d-m-Y",mktime(0,0,0,date("m",$date),date("d",$date)+delta_to_thursdaysameweek($date),date("Y",$date)))." || ".date("d-m-Y",mktime(0,0,0,01,01,date("Y",$date)+1)));
			if ( date("Y",mktime(0,0,0,date("m",$date),date("d",$date)+delta_to_thursdaysameweek($date),date("Y",$date))) == date("Y",mktime(0,0,0,01,01,date("Y",$date)+1)) ) {
				// si le jeudi de cette semaine tombe l'année prochaine alors on est en semaine 1
				return "01";
			} else {
				// si le jeudi de cette semaine tombe cette année alors on est en semaine 53
				return "53";
			}
		} else { 	// si on est en semaine 1 à 52, ok.
			return $tmp_numsem;
		}
	} else { 	// si la date recherchée est antérieure au premier lundi de l'année
		if ($tmp_delta_week == 1) {
			// si on avait noté une semaine de décalage, les jours antérieurs au premier lundi sont tous en semaine 1
			return "01";
		} else {
			// si on n'avait pas noté de semaine de décalage, les jours antérieurs au premier lundi sont tous de la meme semaine que la dernière semaine de l'année d'avant.
			return date_to_weeknum(mktime(0,0,0,12,31,date("Y",$date)-1));
		}
	}
}


function date_to_weekyear($date) {
	// cette fonction calcule à partir d'une date le numéro de semaine associé
	// "la premiere semaine de l'année est celle dans laquelle se trouve le premier jeudi de l'année"

	// l'année de la semaine de la date en cours est l'année du jeudi de la semaine de la date en cours
	return date("Y",mktime(0,0,0,date("m",$date),date("d",$date)+delta_to_thursdaysameweek($date),date("Y",$date)));			
}


function delta_to_thursdaysameweek($date) {
	if (date("w",$date)==0) {
		return -3;
	} else {
		return 4-date("w",$date);
	}
}


function numweek_to_date($numweek,$year,$dayOfWeek) {
	// cette fonction calcule à partir d'un numéro de semaine, d'une année et d'un jour de semaine la date associée.
	$tmp_date = mktime(0,0,0,01,01,$year);
	// si les paramètres sont mal formatés, la fonction renvoie false
	if (is_nan($numweek) || is_nan($year) || is_nan ($dayOfWeek) || $numweek > 53 || $numweek < 0 || $dayOfWeek < 0 || $dayOfWeek > 6 || $year <1970 || $year>2030) { 
		return false;
		exit;
	}
	// initialisation de la date de départ du calcul
	// initialisation au premier lundi de l'année
	// indique au passage si ce lundi appartient à la semaine 1 ou 2 de l'année
	switch(date("w",$tmp_date)) {
		case 1:
			$tmp_date = mktime(0,0,0,01,01,$year);
			$tmp_delta_week = 0;
			break;
		case 0:
			$tmp_date = mktime(0,0,0,01,02,$year);
			$tmp_delta_week = 0;
			break;
		case 6:
			$tmp_date = mktime(0,0,0,01,03,$year);
			$tmp_delta_week = 0;
			break;
		case 5:
			$tmp_date = mktime(0,0,0,01,04,$year);
			$tmp_delta_week = 0;
			break;
		case 4:
			$tmp_date = mktime(0,0,0,01,05,$year);
			$tmp_delta_week = 1;
			break;
		case 3:
			$tmp_date = mktime(0,0,0,01,06,$year);
			$tmp_delta_week = 1;
			break;
		case 2:
			$tmp_date = mktime(0,0,0,01,07,$year);
			$tmp_delta_week = 1;
			break;
	}
	if ($dayOfWeek>=1 && $dayOfWeek<=6) {
		$tmp_delta_day = $dayOfWeek -1;
	} elseif ($dayOfWeek==0) {
		$tmp_delta_day = 6;
	}	
	$tmp_date = mktime(0,0,0,date("m",$tmp_date),date("d",$tmp_date)+($numweek-1-$tmp_delta_week)*7 + $tmp_delta_day,date("Y",$tmp_date));
	//$tmp_date = date("d m Y",$tmp_date);
	// en cas de semaine 53, on vérifie que la semaine 53 existe en effet, sinon on renvoie false
	if ($numweek==53) {
		if (numweek_to_date(01,$year+1,$dayOfWeek)==$tmp_date) {
			//$tmp_date = false;
			$tmp_date = numweek_to_date(52,$year,$dayOfWeek);
		}
	}
	return $tmp_date;
}