begin process at 2012 05 27 21:53:18
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Date / Heure

 > INTERVALLE ENTRE 2 DATES / DIFFÉRENCE ENTRE 2 DATES

INTERVALLE ENTRE 2 DATES / DIFFÉRENCE ENTRE 2 DATES


 Information sur la source

Note :
7,5 / 10 - par 2 personnes
7,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Date / Heure Niveau :Débutant Date de création :01/06/2004 Date de mise à jour :01/06/2004 19:16:31 Vu :10 012

Auteur : natha

Ecrire un message privé
Site perso
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Bon, tout bêtement :

<?=intervaleDates("20040601","20040610")?>

aff iche

9

Et ça marche quelque soit la date. Pas de prob dû à mktime qui marche pu en dessous de 1970. Pas de problème avec les années bissextiles non plus.

Source

  • // Donne l'intervale en jours entre 2 dates
  • function intervaleDates($date1,$date2)
  • {
  • // $date2 sera plus récente que $date1
  • if (intval($date1) > intval($date2))
  • {
  • $tmp = $date1;
  • $date1 = $date2;
  • $date2 = $tmp;
  • }
  • // les dates sont-elles au bon format ?
  • if (ereg("([0-9]{4})([0-9]{2})([0-9]{2})", $date1, $regs1)
  • && ereg("([0-9]{4})([0-9]{2})([0-9]{2})", $date2, $regs2))
  • {
  • $d1 = intval($regs1[3]); $m1 = intval($regs1[2]); $y1 = intval($regs1[1]);
  • $d2 = intval($regs2[3]); $m2 = intval($regs2[2]); $y2 = intval($regs2[1]);
  • $by1 = ($y1 - 2000) % 4;
  • $by2 = ($y2 - 2000) % 4;
  • $dy1 = array(0,31,($by1 == 0 ? 29 : 28),31,30,31,30,31,31,30,31,30,31);
  • $dy2 = array(0,31,($by2 == 0 ? 29 : 28),31,30,31,30,31,31,30,31,30,31);
  • // si les années sont différentes
  • // on ajoute les jours restant à $y1 et les jours de plus à $y2 + 1 pour le passage d'année
  • // puis on ajoute les jours des années entre $y1 et $y2
  • if ($y1 != $y2)
  • {
  • $interval = intervaleDates($date1,$y1."1231") + intervaleDates($y2."0101",$date2) + 1;
  • for ($i = $y1 + 1; $i < $y2; $i++)
  • {
  • $b = ($i - 2000) % 4;
  • $interval += ($b == 0 ? 366 : 365);
  • }
  • return $interval;
  • }
  • // Si $y1 == $y2
  • // si les mois sont égaux, on renvoie la différence entre les jours
  • if ($m1 == $m2)
  • return $d2 - $d1;
  • // sinon on fait un savant calcul ;)
  • if ($m2 > $m1)
  • {
  • $r1 = 0;
  • for ($i = $m1; $i < $m2; $i++)
  • $r1 += $dy1[$i];
  • return $r1 - $d1 + $d2;
  • }
  • }
  • echo "<b>Parse error:</b> Argument(s) incorrect(s) pour intervaleInDays(). Attendu : 'AAAAMMJJ'<br />\n";
  • return FALSE;
  • }
// Donne l'intervale en jours entre 2 dates
function intervaleDates($date1,$date2)
{
	// $date2 sera plus récente que $date1
	if (intval($date1) > intval($date2))
	{
		$tmp = $date1;
		$date1 = $date2;
		$date2 = $tmp;
	}
	// les dates sont-elles au bon format ?
	if (ereg("([0-9]{4})([0-9]{2})([0-9]{2})", $date1, $regs1)
		&& ereg("([0-9]{4})([0-9]{2})([0-9]{2})", $date2, $regs2))
	{
		$d1 = intval($regs1[3]);	$m1 = intval($regs1[2]);	$y1 = intval($regs1[1]);
		$d2 = intval($regs2[3]);	$m2 = intval($regs2[2]);	$y2 = intval($regs2[1]);
		$by1 = ($y1 - 2000) % 4;
		$by2 = ($y2 - 2000) % 4;
		$dy1 = array(0,31,($by1 == 0 ? 29 : 28),31,30,31,30,31,31,30,31,30,31);
		$dy2 = array(0,31,($by2 == 0 ? 29 : 28),31,30,31,30,31,31,30,31,30,31);
		// si les années sont différentes
		// on ajoute les jours restant à $y1 et les jours de plus à $y2 + 1 pour le passage d'année
		// puis on ajoute les jours des années entre $y1 et $y2
		if ($y1 != $y2)
		{
			$interval = intervaleDates($date1,$y1."1231") + intervaleDates($y2."0101",$date2) + 1;
			for ($i = $y1 + 1; $i < $y2; $i++)
			{
				$b = ($i - 2000) % 4;
				$interval += ($b == 0 ? 366 : 365);
			}
			return $interval;
		}
		// Si $y1 == $y2
		// si les mois sont égaux, on renvoie la différence entre les jours
		if ($m1 == $m2)
			return $d2 - $d1;
		// sinon on fait un savant calcul ;)
		if ($m2 > $m1)
		{
			$r1 = 0;
			for ($i = $m1; $i < $m2; $i++)
				$r1 += $dy1[$i];
			return $r1 - $d1 + $d2;
		}
	}
	echo "<b>Parse error:</b> Argument(s) incorrect(s) pour intervaleInDays(). Attendu : 'AAAAMMJJ'<br />\n";
	return FALSE;
}

 Conclusion

Vos commentaires sont les bienvenus.


 Sources du même auteur

COUPER UNE CHAINE DE CARACTÈRES SANS COUPER LES MOTS
UPLOAD D'IMAGE SIMPLE ET EFFICACE
AGE SELON LA DATE DE NAISSANCE

 Sources de la même categorie

Source avec une capture AGENDA GRAPHIQUE SIMPLE (DÉBUTANT) À INTÉGRER par NicomakM
CALCUL DU NOMBRE DE JOURS CONTENUS DANS L'INTERSECTION DE DE... par curphey
CALENDRIER EN 70 LIGNES par tchconst
Source avec Zip CALENDRIER par gabay
CALENDRIER SIMPLE par manuche

Commentaires et avis

Commentaire de koko le 02/06/2004 07:15:35

pourquoi ce compliqué la tache alors que les timestamps c'est tres facile ?

Commentaire de natha le 02/06/2004 10:01:20

Parce que les timestamp ça marche pas avec des années inférieures à 1970 !!! Moi ça marche dans tous les cas !

Commentaire de Kirua le 02/06/2004 14:56:54

natha a raison, les timestamps c'est bon pr des messages de livre d'or mais pr le reste c'est limité

Commentaire de koko le 02/06/2004 16:16:20

j'adore les timestamps ^^
mais si on mets un timestamp négatif, ca ne fait pas avant 1970 ?

Commentaire de Kirua le 02/06/2004 16:25:47

un timestamp c'est un entier positif il me semble.

Commentaire de koko le 02/06/2004 16:45:51

bah j'ai déjà vu des timestamps positif (je crois) mais c'était pas avec php

Commentaire de gege217 le 03/06/2004 09:27:16

y'a un truc encore plus simple, c'est la roquete sql ....

Par exemple sous oracle:

select to_date("18/01/2004","dd/mm/yyyy") - to_date("21/12/2003","dd-mm-yyyy") from dual;

idem pour mysql...

Bon c'est sur, ca nécéssite une base de donnée... mais dans la plupart des cas, on accouple tjs PHP à une base ....

;-)

.oOMimiLOo.

Commentaire de natha le 03/06/2004 10:12:01

Et en SQL ça marche avec des années inférieures au premier janvier 1970 ? Je ne pense pas car le système est basé sur les timestamps.

M'enfin c'est sûr qu'un compteur qui marche avec 1970, faut en avoir l'utilité... Moi j'ai fait ça surtout pour avoir à me prendre la tête sur un algo sympa. J'aime bien me prendre la tête sur des algos ;)

Commentaire de Kirua le 03/06/2004 16:47:27

gege, tu nous fais une horreur :/ tu vas pas embêter le serveur de BDD pour des cons calculs et quelques conditionnelles :/ je ferais jamais ça :/

Commentaire de natha le 03/06/2004 16:55:36

Kirua, faut voir le contexte... selon les cas, si t'es déjà connecté à la base et que ton traitement concerne les données en base à insérer par exemple ou autre alors autant utiliser le truc de gege217. Bon c'est sûr que des cas comme ça il faut en trouver, mais ça peut arriver.

Commentaire de Kirua le 03/06/2004 17:18:25

"Bon c'est sur, ca nécéssite une base de donnée... mais dans la plupart des cas, on accouple tjs PHP à une base ...."

ça veut dire qu'il comptait utiliser cette méthode même hors contexte BDD, ce que, très personnellement, je trouve furieux, sans rancune ;-)

Commentaire de natha le 03/06/2004 17:37:50

Ouaip ça j'avais bien compris ;) C'est juste qu'il faut garder l'idée sous l'coude et pas forcément la rejetter en bloc. Personne n'a (totalement) tord. :p

Commentaire de gege217 le 07/06/2004 09:25:13

Petit rectificatif :

Dans le contexte d'utilisation que j'ai des calculs de date, je fais des stats et des calculs suivants des filtres sur dates avec des périodes données... et j'utilise donc le système de requete SQL pour faire mes calculs.
Comme ca, j'ai plus qu'un traitement d'affichage à faire...

.oOMimiLOo.  

&gt; natha : bien sur, ca marche avec des dates &lt; à 1970.

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,203 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales