CALCUL DU TEMPS ÉCOULÉ ENTRE 2 DATES

Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 - 29 juil. 2006 à 00:02
KaTSuotlz Messages postés 7 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 24 juillet 2008 - 24 juil. 2008 à 21:26
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38828-calcul-du-temps-ecoule-entre-2-dates

KaTSuotlz Messages postés 7 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 24 juillet 2008
24 juil. 2008 à 21:26
...

De Evangun :
au fait ça parait évident mais il faut préciser pour les débutants que les dates fournies à ta fonction sont de type "31-12-2006 22:12:59"
coolboy78 Messages postés 76 Date d'inscription lundi 20 janvier 2003 Statut Membre Dernière intervention 20 novembre 2007
20 nov. 2007 à 09:22
Ce code ne fonctionne !

exemple avec ca :
temps_ecoule("2007-11-19 23:57:01","2007-11-20 00:05:02");

Warning: mktime(): Windows does not support negative values for this function in c:\program files\easyphp1-8\www\heure.php on line 54

366 j 22 hr 57 min 2 sec !!!!!!!

Il n'y a que quelques minutes qui sépare ces 2 date !!
pagis78 Messages postés 6 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 18 avril 2008 6
31 juil. 2006 à 10:47
Merci à tous pour ces commentaires, ca me permet d'améliorer mes codes et leur optimisation.
cs_jeca Messages postés 341 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 14 juillet 2011 14
30 juil. 2006 à 13:43
Bonjour,

Essaie ton code avec ces valeurs :
$dateDeb = '01-07-2006 00:00:00';
$dateFin = '02-07-2006 10:25:01';

Résultat :
Warning: mktime(): Windows does not support negative values for this function in c:\easyphp\www\essai\toto.php on line 57
1 j 9 hr 25 min 2 sec

Pourquoi avoir utilisé ce format de date qui ne correspond à rien ni en php ni dans mysql ? Si tu t'en sert pour calculer des temps de connexion, ça suppose que tu récupère l'heure système, que tu es obligé de transformer dans ce format pour le transformer de nouveau dans ta fonction. Ce n'est quand même pas le plus rapide ni le plus simple.

Ensuite, tous ces 'if' imbriqués rendent le code tout à fait illisible, indigeste et difficile à débugger : la génération du texte de retour ne fonctionne pas. Essaie avec ça :
$dateDeb = '01-07-2006 10:25:01';
$dateFin = '02-07-2006 10:25:01';

Utiliser des noms de variables significatifs ne nuit pas (Ex : $dateDeb au lieu de $dd, $tempsDeb au lieu de $td).

Lorsque des lignes de codes sont utilisées plusieurs fois, autant les déporter dans une fonction, ça éclaircit le code, et la mise au point est plus simple.

A éviter aussi :
$texte="impossible de démarrer la fonction sans la date de début";
Préférer :
$texte='impossible de démarrer la fonction sans la date de début';
car php analyse les chaînes encadrées par des double-quotes afin de rechercher les éventuelles variables à évaluer. Dans le cas présent, il n'y en a pas, donc, il travaille pour rien.

En fin, bref, voici comment j'autrais fait :

<?php
function creeMsg(&$texte, $valeur, $libelle)
{
//-- passage du message par référence, donc pas besoin de return ---------
if ($valeur > 0)
{
$pluriel ($valeur 1) ? '' : 's';
$texte .= $valeur . ' ' . $libelle . $pluriel . ' ';
}
}

function getTimeStamp($chaine)
{
list($date, $temps) = explode(' ', $chaine); // Séparation date et heure
list($jour, $mois, $annee) = explode('-', $date); // Explosion date
list($heure, $minute, $seconde) = explode(':',$temps); // Explosion heure

return mktime($heure, $minute, $seconde, $mois, $jour, $annee);
}

function temps_ecoule($datedebut,$datefin)
{
if ($datedebut == '') return "impossible de démarrer la fonction sans la date de début";
if ($datefin == '') return "processus en cours...";

$debut = getTimeStamp($datedebut);
$fin = getTimeStamp($datefin);
$duree = $fin - $debut;

// Extraction des valeurs attendues du Timestamp
$nbjour = floor($duree / 86400); // Nombre de jours écoulés
$reste = $duree % 86400;
$nbheure = floor($reste / 3600); // Nombre d'heures écoulées
$reste = $reste % 3600;
$nbminute = floor($reste / 60); // Nombre de minutes écoulées
$nbseconde = $reste % 60; // Nombre de secondes écoulées

$texte = '';
creeMsg($texte, $nbjour, 'jour');
creeMsg($texte, $nbheure, 'heure');
creeMsg($texte, $nbminute, 'minute');
creeMsg($texte, $nbseconde, 'seconde');

return $texte; // Renvoi Texte à afficher
} // Fin fonction
$dateDeb = '01-07-2006';
$dateFin = '02-07-2006 10:25:01';

echo temps_ecoule($dateDeb, $dateFin) . '
';
?>

Et avec une date normalement constituée :

<?php
function creeMsg(&$texte, $valeur, $libelle)
{
//-- passage du message par référence, donc pas besoin de return ---------
if ($valeur > 0)
{
$pluriel ($valeur 1) ? '' : 's';
$texte .= $valeur . ' ' . $libelle . $pluriel . ' ';
}
}

function temps_passe($dateDebut, $dateFin)
{
//-- si dateDebut = '' on l'initialise avec la date courante -------------
if ($dateDebut '') $dateDebut date('Y-m-d H:i:s');
//-- si dateFin = '' on l'initialise avec la date courante ---------------
if ($dateFin '') $dateFin date('Y-m-d H:i:s');

if ($dateDebut > $dateFin) return 'La date début doit être < la date fin';

$duree = strtotime($dateFin) - strtotime($dateDebut);
if ($duree == 0) return 'pas de différence';

$jour = floor($duree / 86400);
$reste = $duree % 86400;
$heure = floor($reste / 3600);
$reste = $reste % 3600;
$minute = floor($reste / 60);
$seconde = $reste % 60;

$texte = '';
creeMsg($texte, $jour, 'jour');
creeMsg($texte, $heure, 'heure');
creeMsg($texte, $minute, 'minute');
creeMsg($texte, $seconde, 'seconde');

return $texte;
}

$dateDeb = '2006-07-01';
$dateFin = '2006-07-02 10:25:01';

echo temps_passe($dateDeb, $dateFin) . '
';
?>
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
29 juil. 2006 à 12:17
c'est ce qu'il a fait...
par contre, il faudrait indenter partout : les } qui traînent à la fin sans qu'on sache ce qu'ils referment, c'est pas génial.
Sannazzarotiti Messages postés 228 Date d'inscription jeudi 1 septembre 2005 Statut Membre Dernière intervention 12 avril 2009
29 juil. 2006 à 10:37
pk faire tout sa.

Tu enrengistre le timestamps de depart, tu le soustrait au timestamps de fin sa te fait le nombre de seconde. apres avec des division ta le temps qu'il c'est passer non?

pk faire tout ce code
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
29 juil. 2006 à 00:02
Salut,
j'aime bien la méthode avec laquelle tu as écrit cette fonction, c'est très clair.
Juste un truc : pourquoi as-tu séparé les heures et les jours dans ton mktime ?
tu aurais pu écrire par exemple $pf = mktime($td,$mid,$sd,$mf,$jf,$af); comparer tes timestamp en divisant par les jours et prendre le reste de la division pour les heures.

au fait ça parait évident mais il faut préciser pour les débutants que les dates fournies à ta fonction sont de type "31-12-2006 22:12:59"
à+
Rejoignez-nous