[PHP] Calcul du temps écoulé entre 2 dates [Résolu/Fermé]
A voir également:
- Php différence entre 2 dates
- [PHP] Calcul du temps écoulé entre 2 dates ✓ - Forum - PHP
- Temps écoulé entre deux dates ✓ - Forum - PHP
- Calcul nombre de jours entre deux dates ✓ - Forum - PHP
- Calculer nombre de mois entre deux dates excel ✓ - Forum - Bureautique
- Calculer nombre d'année entre deux dates excel ✓ - Forum - Bureautique
19 réponses
Bludwarf
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 ;)
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 ;)
daldas
différence entre 2 date en une seule ligne
$nbjours = round((strtotime($date1) - strtotime($date2))/(60*60*24)-1);
voila !! pourquoi comliqué les chauses
$nbjours = round((strtotime($date1) - strtotime($date2))/(60*60*24)-1);
voila !! pourquoi comliqué les chauses
Coyote_fou
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.
Par contre celle de Bludwarf est LA méthode à utiliser, qui marche dans toutes les conditions.
Mr. D
@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.
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.
reddark
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 "; ?>
nektarfl
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.
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.
Willy's gang
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
ce qui devrait donner par exemple :
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++; } }
nektarfl
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.
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.
GallyNet
- Messages postés
- 434
- Date d'inscription
- mardi 1 juin 2004
- Statut
- Membre
- Dernière intervention
- 15 décembre 2008
ATTENTION, la fonction mktime à un ordre de paramètre bien précis :
donc au lieu de faire:
tu dois faire :
ensuite (en fait, avant) tu fait :
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 :
dans un contexte global, donc ces variables n'ont pas de valeur.
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.
GallyNet
- Messages postés
- 434
- Date d'inscription
- mardi 1 juin 2004
- Statut
- Membre
- Dernière intervention
- 15 décembre 2008
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
CedK
<?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.
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.
s.spark
- Messages postés
- 2480
- Date d'inscription
- vendredi 29 octobre 2004
- Statut
- Contributeur
- Dernière intervention
- 13 février 2018
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
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
Utilisateur anonyme
Amélioration de la fonction à CedK:
Il fonctionne impeccablement bien ; )
<?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 ; )
htemel
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
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
jisisv
- Messages postés
- 3645
- Date d'inscription
- dimanche 18 mars 2001
- Statut
- Modérateur
- Dernière intervention
- 15 janvier 2017
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.
<?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.
s.spark
- Messages postés
- 2480
- Date d'inscription
- vendredi 29 octobre 2004
- Statut
- Contributeur
- Dernière intervention
- 13 février 2018
- Messages postés
- 2480
- Date d'inscription
- vendredi 29 octobre 2004
- Statut
- Contributeur
- Dernière intervention
- 13 février 2018
Merde j'ai mélangé les serviettes et les torchons, voilà ce qui arrive quand on veut répondre à plusieurs sujet en même temps. Donc oui le calcule est bon bien sur, mais comme tu le dis il ne faut pas poursuivre ce raisonnement pour les mois.
freeman034
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...
justedepassage
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/
Bref, pour ceux qui ont la même question, veuillez disséquer cette page : https://codes-sources.commentcamarche.net/
wiwimagique
- Messages postés
- 488
- Date d'inscription
- mardi 21 janvier 2003
- Statut
- Membre
- Dernière intervention
- 20 avril 2006
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 :-)
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 :-)
freeman034
- Messages postés
- 12
- Date d'inscription
- mardi 20 mai 2003
- Statut
- Membre
- Dernière intervention
- 27 novembre 2020
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
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); ?>
justedepassage
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 !
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 !
kilian
- Messages postés
- 8731
- Date d'inscription
- vendredi 19 septembre 2003
- Statut
- Modérateur
- Dernière intervention
- 20 août 2016
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:
Ca affichera l'année...
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...
comment récupérer la diff des mois et années
merci d'avance
Il ne faut donc pas utiliser :
$nb_jours = $diff->d;
mais :
$nb_jours = $diff->days;