[RESOLU] intervals en milliseconds

Eléphanteau du PHP | 14 Messages

05 déc. 2013, 13:11

Bonjour,
je donne un coup de main pour construire un site sur un pilote de karting.
j'utilise wordpress et dans les champs personnalisables j'ajoute une valeur de temps en m:s,000
je compare 2 données pour afficher un écart entre la pôle position et mon pilote, et c'est là que ça plante.
je n'ai jamais manipulé de temps en php.
$temps_de_qualif = "1:25,332";
$temps_pole_position = "1:25,227";
$ecart_qualf = $temps_de_qualif - $temps_pole_position;
pour le moment, ça me retourne 0. le plus drôle c'est que si j additionne il me retourne 2!
j'ai trouvé cet article: http://www.dinduks.com/php-addition-sou ... es-heures/
et mon bouquin PHP5 me donne des fonctions de date mais pas de calculs.
voilà.
merci d'avance pour vos conseils.
Zika

ViPHP
xTG
ViPHP | 7331 Messages

05 déc. 2013, 14:25

Pourrais-tu m'additionner cela s'il te plaît :

Code : Tout sélectionner

51A}2B
et

Code : Tout sélectionner

92.On,°
A celui qui me trouve la réponse correcte j'offrirai un chocolat. ;)

Bah saches que tu demandes exactement la même chose à PHP, donc il te sort... Ce qu'il peut. ^^

Le plus simple reste de découper ta chaîne et de faire la calcul morceau par morceau.
Tu peux faire un explode() sur la virgule pour récupérer d'une part les millisecondes et d'autre part le reste.
Avec le reste tu recoupes avec un explode() sur les deux points et tu obtiens donc trois éléments.
Que tu peux utiliser comme bon te semble. ;)

Eléphanteau du PHP | 14 Messages

05 déc. 2013, 14:46

Bonjour,
pourtant php est capable d ajouter et de traiter des données de "temps" c'est là ou je ne comprend pas puisque mes valeurs sont écrites correctement h:m:s,000
j'ai trouvé ce post:
http://www.developpez.net/forums/d10711 ... e-seconde/
et le résultat est celui que je recherche
http://www.vola-racing.com/circuitpro/default/
je vais continuer mes recherches et explorer celle que tu proposes merci.

ViPHP
ViPHP | 2577 Messages

05 déc. 2013, 15:23

Il faut regarder dans les fonctions permettant de convertir une chaine de caractères en time ou en datetime.

Eventuelement regardes mktime() et strtotime()

Eléphanteau du PHP | 14 Messages

05 déc. 2013, 16:06

Bonjour,
j'ai regardé mais je n'ai pas d'exemple d'utilisation me permettant de les comprendre :( donc j'explore par rapport à ce que je connais et ça va plutôt vite!
mon bouquin me dit: mktime() me donne une date or je n ai que des heures grand max si j additionne tous les tours parcouru dans l année.
strtotime() est aussi sur la date.
arf! ca se présente pas bien.

ViPHP
ViPHP | 2577 Messages

05 déc. 2013, 16:37

tu peux essayer :
$t1 = mktime (0, 1, 25.332);
$t2 = mktime (0, 1, 25.279);
echo $t1 - $t2;
Je ne suis pas sur que le paramètre "seconde" accepte les décimales.

Eléphanteau du PHP | 14 Messages

05 déc. 2013, 16:44

il me renvoie "0"

Eléphanteau du PHP | 14 Messages

05 déc. 2013, 16:48

pour le moment je test:

Code : Tout sélectionner

function ecart_qualif($arg1,$arg2){ list($mn_sc_1a, $ml_1) = explode(',', $arg1); list($mn_1, $sc_1) = explode(':', $mn_sc_1a); $tps1 = $sc_1.$ml_1; list($mn_sc_2a, $ml_2) = explode(',', $arg2); list($mn_2, $sc_2) = explode(':', $mn_sc_2a); $tps2 = $sc_2.$ml_2; echo $ecart_qualif = ($tps1-$tps2)/1000; }
pour montrer que je cherche une solution quand même.
j'ai du mal à croire qu'il n existe pas de fonction pour :)

ViPHP
xTG
ViPHP | 7331 Messages

05 déc. 2013, 16:59

Topic auquel j'avais participé mais le résultat n'est pas fait à partir de PHP mais du SGBD, en l’occurrence dans son cas grâce à SQLite.
Mais il n'a pas donné suite. :)

Selon moi il n'existe pas de fonction fournie par PHP pour faire cela car il ne gère en opération que des secondes (timestamp est son plus bas niveau).
Après tu peux très bien avoir d'autres unités mais pas mélangées entre elles.
Il sait soustraire des microsecondes pour peu qu'il n'y ai que cela dans la variable en gros.
function ecart_qualif($arg1,$arg2){
   list($mn_sc_1a, $ml_1) = explode(',', $arg1);
   list($mn_1, $sc_1) = explode(':', $mn_sc_1a);
   
   list($mn_sc_2a, $ml_2) = explode(',', $arg2);
   list($mn_2, $sc_2) = explode(':', $mn_sc_2a);

   $ecart_millisecondes = $ml_2 - $ml_1;
   $ecart_secondes = $sc_2 - $sc_1;
   $ecart_mn = $mn_2 - $mn1;

   return $ecart_mn . ':' . $ecart_secondes . ',' . $ecart_millisecondes;
}
Voilà la base en gros (non testé), il resterai je pense à gérer les retenues inversées.

Eléphanteau du PHP | 14 Messages

05 déc. 2013, 17:08

merci pour le coup de main.

Code : Tout sélectionner

function ecart_qualif($arg1,$arg2){ //explose mn sec millieme list($mn_sc_1a, $ml_1) = explode(',', $arg1); list($mn_1, $sc_1) = explode(':', $mn_sc_1a); $tps1 = $sc_1.$ml_1; //recompose sec et mel en une valeur list($mn_sc_2a, $ml_2) = explode(',', $arg2); list($mn_2, $sc_2) = explode(':', $mn_sc_2a); $tps2 = $sc_2.$ml_2; //recompose sec et mel en une valeur $ecart_qualif = ($tps1-$tps2)/1000; //soustrait et / 1000 pour afficher les sec.000 $newtps = str_replace(".", ",", $ecart_qualif); // remplace le . par , pour affichage correcte! echo $newtps; // affiche le résultat! }
si tps 2 est plus petit que tps1 j ai une erreur. donc en regroupant les secondes et les millièmes, je ne peux plus avoir l erreur.
ensuite je recompose mon résultat.
je pense qu'il y a plus simple mais à mon niveau c'est ce que je peux faire.
je ne pense pas que mon pilote se prendra 1 mn par tour, ou sinon il faut qu il reprenne le pingpong!
encore merci pour le partage.

ViPHP
ViPHP | 2577 Messages

05 déc. 2013, 17:22

$tps1 = $sc_1.$ml_1;
à remplacer par :
$pts1 = (float) $mn_1 * 60.0 + (float) $sc_1 + (float) $ml_1 / 1000.0

idem pour $pts2

En fait je vois 2 pbs sinon :
1) si 0:59,123 vs 1:00,234
2) si 1:12,34 et pas 1:12,340

Mammouth du PHP | 2278 Messages

05 déc. 2013, 17:34

Un essai
<?PHP
function convertir($chaine)
{

$t = explode(":", $chaine);

$t1 = explode(",", $t[1]);
$minutes intval($t[0]);
	$secondes = intval($t1[0]);
	$milli = intval($t1[1]);  
$temps = ($minutes*60)+($secondes*1000)+$milli;
return $temps;
}

$z = "1:25,332";

//$z = $z*1;

$t1 =convertir($z);
print "<br>t1: $t1";
$t2= convertir ("1:25,279");
print"<br>t2 $t2";
$diff = $t2 - $t1;
$somme = $t1+$t2;
print "<br>DIFF $diff $somme";
?>
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 14 Messages

05 déc. 2013, 18:13

$tps1 = $sc_1.$ml_1;
à remplacer par :
$pts1 = (float) $mn_1 * 60.0 + (float) $sc_1 + (float) $ml_1 / 1000.0

idem pour $pts2

En fait je vois 2 pbs sinon :
1) si 0:59,123 vs 1:00,234
2) si 1:12,34 et pas 1:12,340
c'est effectivement un bug.
par contre tes modifications affichent un résultat avec une charette de chiffre après la virgule comment limiter à 3?

merci sirakawa mais je ne comprend pas le fonctionnement de ta fonction, je dois être encore trop jeune en php ;)

Eléphanteau du PHP | 14 Messages

05 déc. 2013, 23:35

function ecart_qualif($arg1,$arg2){					//explose mn sec millieme
	list($mn_sc_1a, $ml_1) = explode(',', $arg1);
	list($mn_1, $sc_1) = explode(':', $mn_sc_1a);
	$sc_1a = ($mn_1*60)+$sc_1;						//pour corriger le bug de la minute 1:00,234 VS 0:59,123
	$tps1 = $sc_1a.$ml_1;							//recompose sec et mel en une valeur
	list($mn_sc_2a, $ml_2) = explode(',', $arg2);
	list($mn_2, $sc_2) = explode(':', $mn_sc_2a);
	$sc_2a = ($mn_2*60)+$sc_2;						//pour corriger le bug de la minute 1:00,234 VS 0:59,123
	$tps2 = $sc_2a.$ml_2;							//recompose sec et mel en une valeur
	$ecart_qualif = ($tps1-$tps2)/1000;				//soustrait et / 1000 pour afficher les sec.000
	$newtps = str_replace(".", ",", $ecart_qualif);	// remplace le . par , pour affichage correcte!
	echo $newtps;									// affiche le résultat!
}
Modifié en dernier par zika le 06 déc. 2013, 09:51, modifié 1 fois.

ViPHP
ViPHP | 1996 Messages

06 déc. 2013, 00:18

Je prends un peu le post sans avoir lu les posts précédents mais as-tu essayé :
<?php
$temps_de_qualif = "1:25,332";
$temps_pole_position = "1:25,227";

$tab = array();
foreach (array ($temps_de_qualif,$temps_pole_position) as $temps) {
	list($t,$ms) = explode (',',$temps);
	$tab[]= strtotime("0:".$t)*1000+intval($ms);
}
$ecart_qualf = intval($tab[0]-$tab[1]);
?>
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr