Différence entre deux date (liste récupérée dans un tableau)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 614 fois - Téléchargée 29 fois

Contenu du snippet

Salut les codeurs fou !
Je développe actuellement une petite appli pour faire mes comptes, et j'en suis aux virements mensuels.
J'ai cherché un moments une fonction permettant de récupérer un tableau de liste de date fixe résultants d'une différence entre deux dates.
Ne trouvant rien sur le sujet ,j'ai fini par m'en faire une.
On ne sais jamais, ca peux toujours servir à quelqu'un... La preuve.
Voici donc la fonction:

Source / Exemple :


<?php
function liste_mois($date_debut, $date_fin) {
        $date_suite = array();
	//on flingue les tirets des dates
	list($jour1, $mois1, $annee1) = explode("-", $date_debut);
	list($jour2, $mois2, $annee2) = explode("-", $date_fin);
	//on récupère le nombre de mois entre les deux dates
	$nombre_mois = (($annee2 - $annee1)*12 + ($mois2 - $mois1));
	//on incrémente chaque mois depuis la date début jusquà la date fin
	for($i = 0; $i < $nombre_mois; $i++){
		$mois = ($mois1 + $i);
		//comptage du nombre de jour dans le mois +$i
		$jour = date("j", mktime(0, 0, 0, $mois+1, 0, $annee1));
		//si le nombre de jour du mois +$i < au jour de la date fixée
		if($jour < $jour1){
		//on mets le dernier jour du mois +$i
			$date = date('d-m-Y', (mktime(0, 0, 0, $mois, $jour, $annee1)));
		}else{
		//sinon on traite la meme date du mois +$i
			$date = date('d-m-Y', (mktime(0, 0, 0, $mois, $jour1, $annee1)));
		}
		$date_suite[] = $date;
	}
	return $date_suite;
}
print_r(liste_mois('31-12-2005','15-08-2006'));
?>

Conclusion :


Au résultat, ca donne ce qui suit :
Array ( [0] => 23-02-2006 [1] => 23-03-2006 [2] => 23-04-2006 [3] => 23-05-2006 [4] => 23-06-2006 [5] => 23-07-2006 [6] => 23-08-2006 [7] => 23-09-2006 [8] => 23-10-2006 [9] => 23-11-2006 [10] => 23-12-2006 [11] => 23-01-2007 [12] => 23-02-2007 [13] => 23-03-2007 [14] => 23-04-2007 [15] => 23-05-2007 [16] => 23-06-2007 [17] => 23-07-2007 [18] => 23-08-2007 [19] => 23-09-2007 )

Toutes critiques constructives sont les bienvenues.

A voir également

Ajouter un commentaire

Commentaires

cs_f6xara
Messages postés
68
Date d'inscription
samedi 1 novembre 2003
Statut
Membre
Dernière intervention
6 février 2008
-
Tu devrais aussi définir ta variable de retour au début de ta fonction : $date_suite = array(); car si le choix des dates est dynamique, tu peux te retrouver avec une date de début et une date de fin dans le meme mois, et dans ce cas la, on entre pas dans la boucle et donc date_suite est indéfini
devinekisai
Messages postés
2
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
24 février 2006
-
Je viens de tester la dernière mise à jour mais pas complètement.
Voici un premier jet de résultat :
Array ( [0] => 31-12-2005 [1] => 31-01-2006 [2] => 28-02-2006 [3] => 31-03-2006 [4] => 30-04-2006 [5] => 31-05-2006 [6] => 30-06-2006 [7] => 31-07-2006 )
Je reprendrais le code plus tard pour étaler les dates sur les semaines, voir du bimensuel, trimestriel, semetriel...
malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Non, c'est le mktime () qui crée la date. Et lui connait les dates :-)
Donc ce que je t'ai dit n'était pas correct : les dates seront valides, effectivement.
Par contre l'écart est imprévisible...enfin si, il l'est...plus exactement : il va varier. Et ce parce que tu te bases toujours sur le 1er jour donné en argument, ton écart ne sera donc pas constant.
Mais ça, c'est peut-être ce qu'il te faut :-)

Néanmoins, je pense sincèrement que cette fonction devrait être plus complète, avec un écart de jours donné, voire de mois, ou de semaines ? Et peut-être penser aux jours non ouvrés. De même, justement, concernant cet écart, laisser l'opportunité de modifier la règle de fonctionnement. Ici, on passe au mois suivant : est-ce souhaitable ? Dans le cadre de comptes, je ne suis pas sûr que sauter le mois de février soit une bonne chose ;-)
devinekisai
Messages postés
2
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
24 février 2006
-
Oups !!
Bien vu.
Mais ce qui est étonnant c'est de voir que je n'ai aucune date incohérante concernant tes exemples.
exemple entre 30-12-2005 et 15-08-2006 :
Array ( [0] => 30-12-2005 [1] => 30-01-2006 [2] => 02-03-2006 [3] => 30-03-2006 [4] => 30-04-2006 [5] => 30-05-2006 [6] => 30-06-2006 [7] => 30-07-2006 )
Est-ce la configuration du serveur qui agit sur les dates ???

Mais il est vrai que je vais plancher sur la détection du nombre de jour dans le mois pour rendre les virements plus cohérants.
Merci de la remarque MALALAM.
malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Hello,

ce code a un soucis : il ne sort pas forcément des dates valides.

Deux exemples :
si je donne comme dates d'entrée : 30/12/2005 et 15/08/2006, il va me sortir le 30/02/2006, date qui n'existe pas.
De même, si je rentre le 31/12/2005 au 15/08/2010, il va me sortir beaucoup de dates n'existant pas.
Puisque ce code est utilisé pour faire tes comptes, tu devrais y réflêchir, parce que tu vas avoir un décalage avec ta banque ;-)

Il sera intéressant que tu mettes à jour ce code avec les modifications qui s'imposent, d'ailleurs :-)
Voire que tu permettes dans la fonction de choisir l'écart souhaité entre les dates entrées, parce que là, c'est un peu limitatif.

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.