Boucle semaine entre deux dates

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Boucle semaine entre deux dates

Re: Boucle semaine entre deux dates

par Bisvan » 21 févr. 2012, 19:12

Merci pour tout vos messages.
Je suis allé voir du côté de strtotime() et effectivement j'arrive à obtenir en fonction des numéros de semaines les début et fin de chaque semaine.

Mon soucis maintenant c'est de rentrer tout ça dans une boucle afin d'avoir automatiquement une liste des semaines de ma date de départ jusqu'à aujourd'hui...

Exemple :
$datedebut = 02-01-2012
$datefin = aujourd'hui

>> Afficher :
Semaine 01 du 02-01-2012 au 08-01-2012
Semaine 02 du 09-01-2012 au 15-01-2012
.....
Semaine 08 du 20-02-2012 au 26-02-2012 (vu que nous sommes dans cette semaine)

Comment boucler pour avoir ça...j'ai les méninges qui explosent....
Je ne peux pas boucler sur un nombre de semaine entre les deux dates car va se poser le soucis du changement d'année et des numéros de semaines qui reviennent à 1 (et des années avec 53 semaines).
Une idée ?

Re: Boucle semaine entre deux dates

par moogli » 21 févr. 2012, 17:34

pourquoi ne pas utiliser les classes de dates ? (dateTime etc)
http://fr2.php.net/manual/fr/book.datetime.php

Re: Boucle semaine entre deux dates

par Shenryu » 21 févr. 2012, 11:23

Voila ce que j'avais fais avec le composant Zend Date. J'ai remodelé par rapport à ton besoin donc il y a peut-être des incohérences mais ça peut te donner quelques idées d'algo peut-être :)
// initialize values
$baseDate = new Zend_Date();
$dateDeb = new Zend_Date('maValeurDeDebut');
$dateFin = new Zend_Date('maValeurDeFin');

while($dateDeb <= $dateFin)
{
	// add values for the week
	$baseDate->setDate($dateDeb);
	$baseDate->subDay($baseDate->get(Zend_Date::WEEKDAY_8601)-1);			 // get day of the week and go on the first day
	if (!in_array($baseDate->toString('yyyy-MM-dd'), $listeWeeks)) {
		$listeWeeks[]['start'] = $baseDate->toString('yyyy-MM-dd');			 // first day of the week
		$listeWeeks[]['end'] = $baseDate->addDay(6)->toString('yyyy-MM-dd'); // last day of the week
		$listeWeeks[]['number'] = $baseDate->get(Zend_Date::WEEK);			 // week number
	}
	// increment day
	$dateDeb->addDay(1);
}
++

Re: Boucle semaine entre deux dates

par moogli » 21 févr. 2012, 11:20

comme indiqué plus haut
strtotime + date (et le w en paramètre) tu fournira le numéro de semaine du début et de fin (genre semaine 12 et semaine 28).
a partir de la tu doit pouvoir boucler avec un simple initialisé sur ces valeurs et retrouver les date de début et fin de ces semaines et les afficher.

au pire utilise strtotime("+1 day") pour afficher tant que la date est différente de la dernière - 1 ;)

@+

Re: Boucle semaine entre deux dates

par Bisvan » 21 févr. 2012, 11:03

Voici mon script actuel...mais franchement c'est bien compliqué je trouve...j'aimerai alléger tout ça...
// DATE DE DEBUT
	////////////////////////////////////////
	// Timestamp de la 1e date
	$datedebut = explode("-",$datedebut);
	$TIME_datedebut = mktime (0,0,0,$datedebut[1],$datedebut[2],$datedebut[0]);
	// Numéro du jour de la 1ère date d'activité
	$jourdebut	= (int) date('w', $TIME_datedebut);
	////////////////////////////////////////
	
	
	
	////////////////////
	// DATE FIN
	////////////////////
	// Date actuelle (date fin)
	$datefin=date('Y-m-d');
	$datefin = explode("-",$datefin);
	$TIME_datefin = time();
	// Numéro du jour de la date du jour
	$jourfin	= (int) date('w', $TIME_datefin);
	////////////////////////////////////////
 
 
 
	////////////////////
	// ECART EN JOUR ENTRE LES DEUX DATES
	////////////////////
	// on calcule le nombre de secondes d'écart entre les deux dates
	$ecart_secondes =  $TIME_datefin - $TIME_datedebut;
	// puis on tranforme en jours (arrondi inférieur)
	$ecart_jours = floor($ecart_secondes / (60*60*24));
	$ecart_jours =$ecart_jours+1;
	echo "$ecart_jours<BR>";
	////////////////////////////////////////

// 1e semaine
	
		if($jourdebut=="0")
		{$diff="6";$enlev0="1";}
		elseif($jourdebut=="1")
		{$diff="0";$enlev0="7";}
		elseif($jourdebut=="2")
		{$diff="1";$enlev0="6";}
		elseif($jourdebut=="3")
		{$diff="2";$enlev0="5";}
		elseif($jourdebut=="4")
		{$diff="3";$enlev0="4";}
		elseif($jourdebut=="5")
		{$diff="4";$enlev0="3";}
		elseif($jourdebut=="6")
		{$diff="5";$enlev0="2";}
		
		
		$date_debut_semaine_1 = mktime(date("H"), date("i"), date("s"), $datedebut[1], $datedebut[2]-$diff, $datedebut[0]);
		$date_debut_semaine_1= date('Y-m-d', $date_debut_semaine_1);
		$date_debut_semaine_1 = explode("-",$date_debut_semaine_1);
		
		$date_fin_semaine_1 = mktime(date("H"), date("i"), date("s"), $date_debut_semaine_1[1], $date_debut_semaine_1[2]+6, $date_debut_semaine_1[0]);
		$date_fin_semaine_1= date('Y-m-d', $date_fin_semaine_1);
		$date_fin_semaine_1 = explode("-",$date_fin_semaine_1);
	
		echo "$date_debut_semaine_1[2]/$date_debut_semaine_1[1]/$date_debut_semaine_1[0]  $date_fin_semaine_1[2]/$date_fin_semaine_1[1]/$date_fin_semaine_1[0]<BR>";
		
		
		// Dernière semaine
	
		if($jourfin=="0")
		{$diff="6";$enlev="7";}
		elseif($jourfin=="1")
		{$diff="0";$enlev="1";}
		elseif($jourfin=="2")
		{$diff="1";$enlev="2";}
		elseif($jourfin=="3")
		{$diff="2";$enlev="3";}
		elseif($jourfin=="4")
		{$diff="3";$enlev="4";}
		elseif($jourfin=="5")
		{$diff="4";$enlev="5";}
		elseif($jourfin=="6")
		{$diff="5";$enlev="6";}
		$ecart_jours2=$ecart_jours-$enlev0-$enlev;
		
		$date_debut_semaine_derniere = mktime(date("H"), date("i"), date("s"), $datefin[1], $datefin[2]-$diff, $datefin[0]);
		$date_debut_semaine_derniere= date('Y-m-d', $date_debut_semaine_derniere);
		$date_debut_semaine_derniere = explode("-",$date_debut_semaine_derniere);
		
		$date_fin_semaine_derniere = mktime(date("H"), date("i"), date("s"), $date_debut_semaine_derniere[1], $date_debut_semaine_derniere[2]+6, $date_debut_semaine_derniere[0]);
		$date_fin_semaine_derniere= date('Y-m-d', $date_fin_semaine_derniere);
		$date_fin_semaine_derniere = explode("-",$date_fin_semaine_derniere);
	
		echo "$date_debut_semaine_derniere[2]/$date_debut_semaine_derniere[1]/$date_debut_semaine_derniere[0]  $date_fin_semaine_derniere[2]/$date_fin_semaine_derniere[1]/$date_fin_semaine_derniere[0]<BR>";
	



Les deux variables écarts $ecart_jours2 me donne le nombre de jour entre la première semaine et la dernière semaine ce qui me permet ensuite de compter combien de semaine séparent ma semaine début et ma semaine fin afin de faire une boucle.
Mais franchement c'est moche comme script...

Re: Boucle semaine entre deux dates

par Shenryu » 21 févr. 2012, 10:57

Salut,

J'ai déjà fais quelque chose d'assez similaire avec le composant Zend_Date mais tu n'es pas forcé de l'utiliser (au contraire même je dirai).
Il te faut travailler avec les Timestamp grâce à la fonction strtotime(). Ensuite, tu as toutes les infos pour récupérer les données que tu désires via la fonction date().
"W" te permet de récupérer le numéro de la semaine dans l'année.
"w" te permet de récupérer le numéro du jour de la semaine (0 = dimanche, 6 = samedi) du timestamp courant. A toi de faire en sorte de récupérer le premier et le dernier jour à partir de là. Ce sera plus facile que de galérer avec les jours je pense :P

Bon courage.

Re: Boucle semaine entre deux dates

par Thibaud C » 21 févr. 2012, 10:49

Hello,

J'ai déja fait ca avec les fonctions dates effectivements.

De tête l'idée que j'avais prise :
tu prends ton premier jour, tu regarde a quelle jour de la semaine il correspond, et en fonction (switch) tu enlèves X jours pour reprendre le Lundi :
Par exemple tu trouves Sat->saturday ( samedi si je dis pas de bétise ^^') tu enlèves 5 jours a ta date, et tu as le premier lundi, ensuite pour trouver les autres lundi tu n'as plus qu'a ajouter 7 jours à chaque fois.

Pour trouver le jour sous forme "Sat" par exemple : date('D');

Enfin je ne pense pas que ce soit une solution miracle, mais ca marche :).

Boucle semaine entre deux dates

par Bisvan » 21 févr. 2012, 10:42

Bonjour,

J'essaye de mettre en place un système de boucle semaine par semaine entre deux dates.
J'aimerai utiliser à fond les fonctions dates de PHP mais....je sèche !

J'ai une date de début : $datedebut (imaginons 08-02-2012)
J'ai une date de fin : $datefin (imaginons 25-02-2012)

J'aimerai bien afficher entre ces deux dates les semaines correspondantes, soit :

Semaine 1 du 06-02-2012 au 12-02-2012
Semaine 2 du 13-02-2012 au 19-02-2012
Semaine 3 du 20-02-2012 au 26-02-2012

Je pense bien qu'on pourrait bidouiller un truc avec un for($i=..;$i>=..;$i++) mais je me demande si en combinant une boucle for et une boucle sur les dates c'est pas possible...
Le seul soucis c'est que niveau gestion des dates je suis très très mauvais...
Auriez vous une idée pour m'aider ?

C'est gentil ! Merci ! :)