KaTSuotlz
Messages postés7Date d'inscriptionlundi 27 mars 2006StatutMembreDernière intervention24 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és76Date d'inscriptionlundi 20 janvier 2003StatutMembreDernière intervention20 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és6Date d'inscriptionmercredi 20 juillet 2005StatutMembreDernière intervention18 avril 20086 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és341Date d'inscriptionmercredi 17 juillet 2002StatutMembreDernière intervention14 juillet 201114 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
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...";
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';
Evangun
Messages postés1980Date d'inscriptiondimanche 20 février 2005StatutMembreDernière intervention24 septembre 20124 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és228Date d'inscriptionjeudi 1 septembre 2005StatutMembreDernière intervention12 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és1980Date d'inscriptiondimanche 20 février 2005StatutMembreDernière intervention24 septembre 20124 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"
à+
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"
20 nov. 2007 à 09:22
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 !!
31 juil. 2006 à 10:47
30 juil. 2006 à 13:43
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) . '
';
?>
29 juil. 2006 à 12:17
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.
29 juil. 2006 à 10:37
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
29 juil. 2006 à 00:02
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"
à+