[PHP] Calcul du temps écoulé entre 2 dates
Résolu/Fermé
freeman034
-
haha -
haha -
Bonjour à tous,
Je voudrais savoir si quelqu'un peut m'aider à calculer le temps écoulé entre 2 dates, par exemple une date $date et le jour présent.
Je sais qu'il faut faire un timestamp pour les 2 dates après les convertir en secondes, les soustraires et les reconvertir en mois et années mais j'y arrive pas... quelqu'un peut me donner un exemple concrêt svp ? Merci !
Je voudrais savoir si quelqu'un peut m'aider à calculer le temps écoulé entre 2 dates, par exemple une date $date et le jour présent.
Je sais qu'il faut faire un timestamp pour les 2 dates après les convertir en secondes, les soustraires et les reconvertir en mois et années mais j'y arrive pas... quelqu'un peut me donner un exemple concrêt svp ? Merci !
19 réponses
-
Franchement je crois qu'il vaut mieux passer un peu de temps sur la doc PHP plutôt que se taper des lignes de code comme ça !
Il existe une méthode diff (de la classe DateTime) qui permet de calculer directement un intervalle. Après avec l'intervalle on peut récupérer ce qu'on veut : le nombre de jours, de secondes, etc.
Voilà un exemple d'utilisation avec des chaines du genre : '2009-06-08 20:30:00'
$d1 = new DateTime('2009-06-08 20:30:00');
$d2 = new DateTime('2009-06-10 20:30:00');
$diff = $d1->diff($d2);
$nb_jours = $diff->d;
Voilà j'espère que ça aura servit à quelqu'un ;) -
différence entre 2 date en une seule ligne
$nbjours = round((strtotime($date1) - strtotime($date2))/(60*60*24)-1);
voila !! pourquoi comliqué les chauses-
-
-
-
La "méthode" proposée par daldas date d'il y a 10 ans (pph4) et ne marche pas: Elle ne tiens pas compte des fuseaux horaires, ni des années bissextiles, ni des changements d'heures, etc... ça fait belle lurette qu'il ne faut plus travailler sur les timestamp (m'enfin il a voulu faire son intéressant avec une méthode en une ligne, sans la comprendre, dommage).
Par contre celle de Bludwarf est LA méthode à utiliser, qui marche dans toutes les conditions. -
@Coyote_fou
Sa méthode est en effet la plus propre et la plus juste.
Mais il y a une condition dans laquelle est ne fonctionne pas: lorsque l'on travaille sur un serveur tournant sous une version de PHP plus ancienne que la 5.3.
Bien entendu, ce problème est d'autant plus important lorsque il nous est impossible de mettre à jour l'environnement.
-
-
Copiez puis coller cela dans un fichier PHP est voiyez le resultat :
<?php $d1 = new DateTime('2011-06-08 19:30:00'); $d2 = new DateTime('2012-01-10 7:30:00'); $diff = $d1->diff($d2); $diffa = $d1->diff($d2); $diffm = $d1->diff($d2); $diffh = $d1->diff($d2); $diffi= $d1->diff($d2); $diffs = $d1->diff($d2); echo $nb_jours = $diff->d." Jours "; echo $nb_mois = $diffm->m." mois "; echo $nb_an = $diffa->y." ans "; echo "<br>"; echo $nb_heur = $diffh->h." Heurs "; echo $nb_min = $diffi->i." Minutes "; echo $nb_sec = $diffs->s." Seconde "; ?> -
Je pense que tous voulaient calculer un écart sur leur site, et pas connaître une différence entre deux dates à un moment précis (sinon, pourquoi demander comment on le fait en PHP)
Je me suis posé la même question, et comme je répugne à faire du code de plusieurs kilomètres de long (qu'il faut charger et exécuter), j'ai cherché la solution la plus courte.
$datedepart = mktime (h,min,sec,mois,jour,annee); // chaque élément est rentrée en valeur numérique
$dateactuelle = time(); // on récupère la date du serveur
$difdate = ($dateactuelle-$datedepart)/(60*60*24) // l'écart est donné en secondes, on divise pour l'avoir en jour (en fait, on en fait ce qu'on veut ensuite.)
// 3 lignes seulement pour la clarté du texte, mais on peut tout mettre en une seule ligne, et ça marche correctement. Merci à ceux qui m'ont donné des pistes. -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
-
Pour convertir une date du style : 26/01/2011 ou 26-01-2011 ou encore 2011-01-26 au format timestamps il suffit de faire : $date1 = strtotime("26-01-2011");
voir : http://www.php.net/manual/fr/function.strtotime.php
Voici maintenant une fonction de calcul entre 2 timestamps// calcul temps entre 2 timestamps (date la + proche, date la + ancienne) function diff_date($date1, $date2) { $second = floor($date1 - $date2); if ($second == 0) return "0"; return array("an" => date('Y', $second)-1970, "mois" => date('m', $second)-1, "semaine" => floor((date('d', $second)-1)/7), "jour" => (date('d', $second)-1)%7, "heure" => date('H', $second)-1, "minute" => date('i', $second)-0, "seconde" => date('s', $second)-0 ); }
ce qui devrait donner par exemple :// Les 2 dates $date1 = strtotime("now"); // maintenant $date2 = strtotime("26-01-2011"); // La fonction de calcul qui retourne un tableau $tab = diff_date($date1, $date2); // on passe en revue le tableau $compteur = 0; foreach ($tab as $key => $value) { if ($value > 0) { echo (($compteur) ? ', ' : '') . $value .' '. $key; if ($value > 1 && $key != "mois") echo 's'; $compteur++; } } -
En résumé, on a désormais plusieurs possibilités.
Certaines ont été très commentées, notamment au vu de la longueur du code, et d'autres ont du passer complètement inaperçues (la mienne par exemple en 3 ligne qui donne une solution viable) puisque personne ne s'est permis de la commenter.
C'est là qu'on voit ceux qui programment depuis peu de temps avec des machines qui possèdent de la mémoire en pagaille et ou le temps machine ne représente rien, et des anciens comme moi qui cherchent toujours à utiliser la bonne fonction pour résoudre dans le moins de code possible un petit problème.
C'est vrai qu'il est loin le temps des machines dont la mémoire se chiffrait en Ko (kilo-octets pour ceux, trop jeunes ne connaissent plus cette unité) et dont la vitesse des processeurs se chiffrait en Mhz (Méga Herz) et ou la moindre économie de cycle et de place avait un intérêt crucial sur la vitesse d'un programme. -
ATTENTION, la fonction mktime à un ordre de paramètre bien précis :
int mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]] )
donc au lieu de faire:return mktime(0, 0, 0, $day, $month, $year);
tu dois faire :return mktime(0, 0, 0, $month, $day, $year);
ensuite (en fait, avant) tu fait :list($day, $month, $year) = sscanf($date,"%d/%d/%d");
mais les varaibles $day, $month, $year ne font pas défini. Donc elle sont uilisé seulement dans la fonction. Hors, tu veut les uilisé plus tard en faisant :elapsed($day, $month, $year);
dans un contexte global, donc ces variables n'ont pas de valeur. -
Pour, qu'a l'interrieur d'une fonction, tu utilise les variable qui sont a l'exterieur de la fonction il faut uiliser le mot clé "global" :
function maFonction(){ global $maVariable; $maVariable=5 } $maVariable=2; maFonction(); echo $maVariable; // Affiche 5 -
<?php
echo '<pre>';
$date1 = strtotime('20100301 01:37:01');
$date2 = strtotime('20100301 01:36:00');
echo 'Nombre de jours : '. (date('d',$date1 - $date2)-1)."\n";
echo 'Nombre de mois : '. (date('m',$date1 - $date2)-1)."\n";
echo 'Nombre de minutes : '. (date('i',$date1 - $date2)+0)."\n";
?>
et voilou.-
Salut CedK,
Je ne pense pas que ton code fonctionne.
Sans essayer je dirais :
date() retourne une date, donc date('d',$date1 - $date2) retourne le jour de cette date auquel correspond le timestamp calculé, pas le nombre de jour en les deux.
Si on prend le timestamp actuel 1267452829 qu'on rajoute un jour 1267452829 + 86400
On fait la différence :
1267539229 - 1267452829 = 86400
Le timestamp 86400 correspond au 2 janvier 1970, 00:00:00
date('d', '86400') = 2
date('m', '86400') = 1 (janvier)
date('i', '86400') = 00 -
-
Amélioration de la fonction à CedK:
<?php function temps_ecoule($date,$type) { if($type == "timestamp") { $date2 = $date; // depuis cette date } elseif($type == "date") { $date2 = strtotime($date); // depuis cette date } else { return "Non reconnu"; exit(); } $date1 = date("U"); // à la date actuelle $return = ""; // ######## ANNEE ######## if((date('Y',$date1 - $date2)-1970) > 0) { if((date('Y',$date1 - $date2)-1970) > 1) { $echo_annee = (date('Y',$date1 - $date2)-1970)." Anneés"; $return = $echo_annee.", "; } else { $echo_annee = (date('Y',$date1 - $date2)-1970)." Année"; $return = $echo_annee.", "; } } else { $echo_annee = ""; $return = $return; } // ######## MOIS ######## if((date('m',$date1 - $date2)-1) > 0) { $echo_mois = (date('m',$date1 - $date2)-1)." Mois "; if(!empty($echo_annee)) { $return = $echo_annee." et ".$echo_mois; } else { $return = $echo_mois; } } else { $echo_mois = ""; $return = $return; } // ######## JOUR ######## if((date('d',$date1 - $date2)-1) > 0) { if((date('d',$date1 - $date2)-1) > 1) { $echo_jour = (date('d',$date1 - $date2)-1)." Jours"; if(!empty($echo_annee) OR !empty($echo_mois)) { $return = $return.$echo_mois." et ".$echo_jour; } else { $return = $return.$echo_mois.$echo_jour; } } else { $echo_jour = (date('d',$date1 - $date2)-1)." Jour"; if(!empty($echo_annee) OR !empty($echo_mois)) { $return = $return.$echo_mois." et ".$echo_jour; } else { $return = $return.$echo_mois.$echo_jour; } } } else { $echo_jour = ""; $return = $return; } // ######## HEURE ######## if((date('H',$date1 - $date2)-1) > 0) { if((date('H',$date1 - $date2)-1) > 1) { $echo_heure = (date('H',$date1 - $date2)-1)." Heures"; if(!empty($echo_annee) OR !empty($echo_mois) OR !empty($echo_jour)) { $return = $echo_annee.$echo_mois.$echo_jour." et ".$echo_heure; } else { $return = $echo_annee.$echo_mois.$echo_jour.$echo_heure; } } else { $echo_heure = (date('H',$date1 - $date2)-1)." Heure"; if(!empty($echo_annee) OR !empty($echo_mois) OR !empty($echo_jour)) { $return = $echo_annee.$echo_mois.$echo_jour." et ".$echo_heure; } else { $return = $echo_annee.$echo_mois.$echo_jour.$echo_heure; } } } else { $echo_heure = ""; $return = $return; } // ######## MINUTE ET SECONDE ######## $virgule_annee = ""; $virgule_mois = ""; $virgule_jour = ""; if(date('i',$date1 - $date2) > 0) { if(date('i',$date1 - $date2) > 1) { $echo_minute = round(date('i',$date1 - $date2))." Minutes"; if(!empty($echo_annee) OR !empty($echo_mois) OR !empty($echo_jour) OR !empty($echo_heure)) { if(!empty($echo_annee)) { if(!empty($echo_mois) OR !empty($echo_jour) OR !empty($echo_heure)) { $virgule_annee = ", "; } } if(!empty($echo_mois)) { if(!empty($echo_jour) OR !empty($echo_heure)) { $virgule_mois = ", "; } } if(!empty($echo_jour)) { if(!empty($echo_heure)) { $virgule_jour = ", "; } } $return = $echo_annee.$virgule_annee.$echo_mois.$virgule_mois.$echo_jour.$virgule_jour.$echo_heure." et ".$echo_minute; } else { $return = $echo_annee.$virgule_annee.$echo_mois.$virgule_mois.$echo_jour.$virgule_jour.$echo_heure.$echo_minute; } } else { $echo_minute = round(date('i',$date1 - $date2))." Minute"; if(!empty($echo_annee) OR !empty($echo_mois) OR !empty($echo_jour) OR !empty($echo_heure)) { if(!empty($echo_annee)) { if(!empty($echo_mois) OR !empty($echo_jour) OR !empty($echo_heure)) { $virgule_annee = ", "; } } if(!empty($echo_mois)) { if(!empty($echo_jour) OR !empty($echo_heure)) { $virgule_mois = ", "; } } if(!empty($echo_jour)) { if(!empty($echo_heure)) { $virgule_jour = ", "; } } $return = $echo_annee.$virgule_annee.$echo_mois.$virgule_mois.$echo_jour.$virgule_jour.$echo_heure." et ".$echo_minute; } else { $return = $echo_annee.$virgule_annee.$echo_mois.$virgule_mois.$echo_jour.$virgule_jour.$echo_heure.$echo_minute; } } } else { if(date('s',$date1 - $date2) > 1) { $echo_minute = round(date('s',$date1 - $date2))." Secondes"; if(!empty($echo_annee) OR !empty($echo_mois) OR !empty($echo_jour) OR !empty($echo_heure)) { if(!empty($echo_annee)) { if(!empty($echo_mois) OR !empty($echo_jour) OR !empty($echo_heure)) { $virgule_annee = ", "; } } if(!empty($echo_mois)) { if(!empty($echo_jour) OR !empty($echo_heure)) { $virgule_mois = ", "; } } if(!empty($echo_jour)) { if(!empty($echo_heure)) { $virgule_jour = ", "; } } $return = $echo_annee.$virgule_annee.$echo_mois.$virgule_mois.$echo_jour.$virgule_jour.$echo_heure." et ".$echo_minute; } else { $return = $echo_annee.$virgule_annee.$echo_mois.$virgule_mois.$echo_jour.$virgule_jour.$echo_heure.$echo_minute; } } else { if(!empty($echo_annee) OR !empty($echo_mois) OR !empty($echo_jour) OR !empty($echo_heure)) { if(!empty($echo_annee)) { if(!empty($echo_mois) OR !empty($echo_jour) OR !empty($echo_heure)) { $virgule_annee = ", "; } } if(!empty($echo_mois)) { if(!empty($echo_jour) OR !empty($echo_heure)) { $virgule_mois = ", "; } } if(!empty($echo_jour)) { if(!empty($echo_heure)) { $virgule_jour = ", "; } } $return = $echo_annee.$virgule_annee.$echo_mois.$virgule_mois.$echo_jour.$virgule_jour.$echo_heure." et ".$echo_minute; } else { $return = $echo_annee.$virgule_annee.$echo_mois.$virgule_mois.$echo_jour.$virgule_jour.$echo_heure.$echo_minute; } } } return "Il y a ".$return; } echo '<pre>'; $date = "1284346290"; echo temps_ecoule($date,"timestamp")."\n"; // timestamp ou date $date = date('U')-9; // temps actuel, moins 9 secondes echo temps_ecoule($date,"timestamp")."\n"; // affiche: Il y a 9 Secondes $date = "13-04-2010 4:00"; echo temps_ecoule($date,"date")."\n"; $date = "13-04-2010 4:00"; echo temps_ecoule($date,"dat")."\n"; // Affiche: Non reconnu echo '</pre>'; ?>
Il fonctionne impeccablement bien ; ) -
-
-
Une méthode tres simple est de passer par une conversion du calaendrier gregorien au calednrier julien voici le code :
class nbNuits {
function calc($startDate,$endDate){ // format jj/mm/aaaa
// Parse dates for conversion
$star=explode("/",$startDate);
$end=explode("/",$endDate);
// Convert dates to Julian Days
$start_date = gregoriantojd($star[1], $star[0], $star[2]);
$end_date = gregoriantojd($end[1], $end[0], $end[2]);
// Return difference
return round(($end_date - $start_date), 0);
}
}
pour + d'info :
http://www.php.net/manual/fr/function.date.php -
Ca c'est du niveau école primaire
<?php
$XXX=1223456;
$sec=$XXX % 60;
$X=floor($XXX/60) ;
$min = $X %60 ;
$X = floor($X/60);
printf('%d hours, %d minutes, %d seconds\n', $X,$min,$sec);
?>
Tu évalueras de même, le nombre de jours( avec l'opérateur binaire % : reste de la division entière, a.k.a modulo). Pour les mois cela n'a pas beaucoup de sens.
-
Comment faire pour que les 3 variables précédemment utilisées dans la premiere fonction soient réutilisables dans la deuxieme ? L'idée était de découper la date en 3 puis des utiliser ensuite...
-
Après quelques jours de recherche, il suffisait de demander pour que la réponse puisse être trouvée...
Bref, pour ceux qui ont la même question, veuillez disséquer cette page : https://codes-sources.commentcamarche.net/ -
Exacte
par contre, à ma connaissance, il n'y a pas une fonction qui te dit
que XXX secondes correspond à Y jours, Z heures, etc ....
A moins que quelqu'un ait une solution toute faite pour cela :-)
-
Ok ben j'ai essayé avec cette méthode mais bon elle marche pas est-ce que vous pouvez me dire où est l'erreur ?
La premiere fonction est sensée découper la date en jj mm et aaaa et après calculer avec la deuxieme fonction mais ça marche pas... quelqu'un peut m'aider svp ? Merci
<? $date = '06/06/1994'; function date2timestamp($date) { list($day, $month, $year) = sscanf($date,"%d/%d/%d"); return mktime(0, 0, 0, $day, $month, $year); } echo date2timestamp($date); function elapsed($day, $month, $year) { $todayMonth = date(n); $todayDay = date(j); $todayHour = date(G); $todayMinute = date(i); $monthday = date(nj); $link = $month.$day; $datepoint = $link; if ($monthday < $datepoint) $years = date(Y) - $year - 1; else $years = date(Y) - $year; if ($years < 1) $yearWord = ''; elseif ($years == 1) $yearWord = 'year,'; elseif ($years > 1) $yearWord = 'years,'; if ($todayMonth > $month) { if ($todayDay < $day) $months = $todayMonth - $month -1; else $months = $todayMonth - $month; } else { $between = $month - $todayMonth; $plus = 12 - $month; if ($todayDay < $day) $months = $month + $plus - $between -1; else $months = $month + $plus - $between; } if ($months == 1) $monthWord = 'month,'; elseif ($months > 1) $monthWord = 'months,'; if ($todayDay > $day) { if ($todayHour < $hour) $days = $todayDay - $day -1; else $days = $todayDay - $day; } else { $between = $day - $todayDay; $daysToEndOfMonth = date(t) - $day; if (date(t) == 28) $plus = $daysToEndOfMonth; if (date(t) == 29) $plus = $daysToEndOfMonth; if (date(t) == 30) $plus = $daysToEndOfMonth; if (date(t) == 31) $plus = $daysToEndOfMonth; if ($todayHour < $hour) $days = $day + $plus - $between - 1; else $days = $day + $plus - $between; } if ($days == 1) $dayWord = 'day'; else $dayWord = 'days'; if ($todayHour > $hour) { if ($todayMinute < $minute) $hours = $todayHour - $hour - 1; else $hours = $todayHour - $hour; } else { $between = $hour - $todayHour; $plus = 24 - $hour; if ($todayMinute < $minute) $hours = $hour + $plus - $between - 1; else $hours = $hour + $plus - $between; } if ($hours == 1) $hourWord = 'hour,'; if ($hours > 1) $hourWord = 'hours,'; if ($todayMinute > $minute) { $minutes = $todayMinute - $minute; } else { $between = $minute - $todayMinute; $plus = 60 - $minute; $minutes = $minute + $plus - $between; } if ($minutes == 60) $minutes = 0; if ($minutes == 1) $minuteWord = 'minute'; elseif ($minutes > 1) $minuteWord = 'minutes'; if ($years == 0) { $years = ''; $yearWord = ''; } if ($months == 0) { $months = ''; $monthWord = ''; } if ($days == 0) { $days = ''; $dayWord = ''; } if ($hours == 0) { $hours = ''; $hourWord = ''; } if ($minutes == 0) { $minutes = ''; $minuteWord = ''; } echo $years.' '.$yearWord.' '.$months.' '.$monthWord.' '.$days.' '.$dayWord.''; } date2timestamp($date); elapsed($day, $month, $year); ?> -
Le sujet correspond un peu à ma problématique. Les réponses données ne correspondent à pas grand chose...
Ayant deux dates (format yyyymmddhhiiss), la conversion par mktime est assez bancale et me décale le résultat d'un écart significatif...
Exemple : entre 20090710174718 et 20090709120313, on a bien 1 jour, 5h, 44min, 5sec lorsque le calclul est fait "à la main" et on obtient 1 jour, 4h, 44min, 6sec. Et oui, pour 1h06sec, c'est un bien grand écart...
Si par hasard quelqu'un avait une idée plus précise, je veux bien prendre une nouvelle solution ! -
Salut,
Ca se passe avec mktime()
http://fr2.php.net/manual/en/function.mktime.php
Exemple, si tu fais:
mktime(0, 0, 0, 12, 55, 2005);
Ici, le 55 est le nombre pour les jours... Il ne devrait pas être superieur à 31, donc Php te convertira comme il faut, en ajoutant un mois et en faisant le bon calcul.
Ensuite avec date(), tu récupère comme tu veux ta date calculée, sachant que ton timestamp retourné par mktime doit être passé en deuxième argument de date(), ex:$a=mktime(0, 0, 0, 12, 55, 2005); echo date("Y",$a);
Ca affichera l'année... -