Page 1 sur 1

Temps en seconde ---> 00:00:00

Posté : 18 oct. 2007, 13:29
par Sebe
Bonjour,

J'ai un soucis ... plus moyen de revenir sur la méthode pour transformer un temps en seconde vers un format 'standard' de type 00:00:00 !
Pour l'instant, j'ai codé ceci:

Code : Tout sélectionner

<?php $km = ($course->kilometrage); $temps_explosee = explode(":", $clas->temps); $heure = $temps_explosee[0]; $minute = $temps_explosee[1]; $seconde = $temps_explosee[2]; $temps = (($heure*3600) + ($minute*60) + $seconde) / $km; echo $moyenne = $temps; ?>
L'objectif est d'avoir une moyenne kilométrique.
J'obtiens ceci 192.25490196078 et je voudrais obtenir ceci 00:03:12

Que dois-je faire ? Merci

Posté : 18 oct. 2007, 13:38
par d0m
- soit utiliser la méthode date en prenant le timestamp du début d'une journée 0h00m00s et en ajoutant ton temps
- soit :
prendre la partie entière de la division de ton nombre de secondes par 3600 pour les heures
diviser le reste de la division par 60 et prendre la partie entière pour les minutes
le reste de la seconde division sera les secondes.

Posté : 18 oct. 2007, 13:39
par sebddec38
Salut,

c'est plues des maths que du php je crois...
1/ pour avoir les minutes, tu divise ($heure*3600) + ($minute*60) + $seconde) par 60 et tu prends l'entier inférieur
2/ si c'est >60, tu divise le résultat par 60 et tu prends l'entier inférieur pour avoir les heures. Tu conserve le reste et tu refais l'étape 1
3/ Si c'est < 60, tu prend le reste et t'as les secondes

Posté : 18 oct. 2007, 20:50
par Sebe
Re,

J'ai pas trouvé comment faire avec le Timestamp alors j'ai essayé la 2e proposition

Code : Tout sélectionner

<?php $km = ($course->kilometrage); $temps_explosee = explode(":", $clas->temps); $heure = $temps_explosee[0]; $minute = $temps_explosee[1]; $seconde = $temps_explosee[2]; $moyenne = ((($heure*3600) + ($minute*60) + $seconde) / $km); $h_explosee = explode(".", ($moyenne / 100)); $moy_heure = (($h_explosee[0]) / 60); if ($moy_heure < 1){ $moy_heure = ''; }else {$moy_heure .= ':';} $moyenne = (($moyenne / 100) - $moy_heure); $m_explosee = explode(".", (($moyenne * 100)/60)); $moy_minute = ($m_explosee[0]); if ($moy_minute < 1){ $moy_minute = 0; } if ($moy_minute < 10) { $moy_minute = '0' . $moy_minute . ':'; } $moyenne = (($moyenne * 100) - ($moy_minute * 60)); $s_explosee = explode(".", ($moyenne)); $moy_seconde = ($s_explosee[0]); if ($moy_seconde < 1){ $moy_seconde = 0; } if ($moy_seconde < 10) { $moy_seconde = '0' . $moy_seconde; } echo $moy_heure . $moy_minute . $moy_seconde; ?>
N'est-ce pas un peu fastidieux ... n'existe-t-il pas une méthode plus courte ?

Merci

Posté : 18 oct. 2007, 21:52
par Hubert Roksor
As-tu essayé ça ? Je pense que ça correspond
date('H:i:s', $clas->temps)

Posté : 19 oct. 2007, 00:21
par Patriboom
Pour ma part, je me suis fait deux petites fonctions que j'appelle souvent.

La première converti du numérique au chrono:
function ConvTemps ($TempsNum) {
			 //Mode d'enregistrement du temps : 
			 //		- Heures converties en minutes : 			  substr($TempsNum, 0, 2)*60
			 //		- Minutes restantes additionnées : 			  substr($TempsNum, 3, 2)
			 //		- Secondes converties en factions de minute : substr($TempsNum, 6, 2)/60
			   $Heures = floor(floor($TempsNum) / 60);
			   $Minute = floor($TempsNum - ($Heures*60));
 			   $Second = round(($TempsNum - ($Heures*60) - ($Minute)) * 60);
			   if ( $Heures < 10 ) { $TempsCalc = "0"; } else { $TempsCalc = ""; }
			   $TempsCalc .= $Heures.":";
			   if ( $Minute < 10) { $TempsCalc .= "0"; }
			   $TempsCalc .= $Minute.":";
			   if ( $Second < 10) { $TempsCalc .= "0"; }
			   $TempsCalc .= $Second; 
		return $TempsCalc;
}        

La deuxième fait l'inverse:
<?PHP 
function ConvTemps ($TempsTEMP) {
	   $posi1 = strpos($TempsTEMP, ":");
	   $HeureEnMinutes = substr($TempsTEMP, 0, ($posi1-0))*60;
	   $MinutesDirecte = substr($TempsTEMP, ($posi1 + 1), 2);
	   $SecondesEnMinu = substr($TempsTEMP, ($posi1 + 4), 2)/60;
	   $TempsDecimal = $HeureEnMinutes + $MinutesDirecte + $SecondesEnMinu;

		 return $TempsDecimal;
}
?>
Ce n'est peut-être pas la grande classe, mais ça fait le travail.

Posté : 19 oct. 2007, 10:21
par Sebe
As-tu essayé ça ? Je pense que ça correspond
date('H:i:s', $clas->temps)
Maintenant oui ...
$km = ($course->kilometrage);
$temps_explosee = explode(":", $clas->temps);
	
$heure = $temps_explosee[0];
$minute = $temps_explosee[1];
$seconde = $temps_explosee[2];
			
$moyenne = ((($heure*3600) + ($minute*60) + $seconde) / $km);
			
echo date('H:i:s', $moyenne);
Ceci dit, il y a un problème puisque pour '192.25490196078 seconde' il me met '01:03:12' au lieu de '00:03:12' ... sinon, l'idée est meilleurs que la mienne :roll:

Merci

Posté : 19 oct. 2007, 10:28
par d0m
Ceci dit, il y a un problème puisque pour '192.25490196078 seconde' il me met '01:03:12' au lieu de '00:03:12'
c'est parce que le timestamp 0 équivaut au 1er janvier 1970 à 1:00:00 et pas 0:00:00

c'est pour cela que je te disais de prendre un jour (n'importe lequel à 0:00:00) et d'y ajouter tes secondes.
date('H:i:s',mktime(0,0,0,1,1,1995)+$temps);

Posté : 19 oct. 2007, 10:33
par Sebe
c'est parce que le timestamp 0 équivaut au 1er janvier 1970 à 1:00:00 et pas 0:00:00

c'est pour cela que je te disais de prendre un jour (n'importe lequel à 0:00:00) et d'y ajouter tes secondes.
date('H:i:s',mktime(0,0,0,1,1,1995)+$temps);
Effectivement, cela fonctionne beaucoup mieux ainsi :roll:

Merci

NB: Je garde aussi l'idée de faire une fonction pour les appels ... cela sera plus facile !

Posté : 19 oct. 2007, 11:46
par Hubert Roksor
il me met '01:03:12' au lieu de '00:03:12'
En fait je n'ai pas pensé que le fuseau horaire serait pris en compte. Si tu avais été dans les îles Fidji tu aurais eu 12:03:12... Pour avoir un timestamp avec un fuseau horaire "neutre" tu peux utiliser gmdate()
gmdate('H:i:s', 1);
Je ne l'ai pas précisé, mais ce n'est valable que pour les temps de moins de 24 heures, ça devrait être assez même pour un gros marathon :lol:
le timestamp 0 équivaut au 1er janvier 1970 à 1:00:00
En fait, le principe c'est que le timestamp 0 équivaut au 1er janvier 1970 à 0:00:00 à l'heure de Greenwich (UTC), donc une heure plus tard pour nous, Français.

Posté : 19 oct. 2007, 13:11
par Sebe
Je ne l'ai pas précisé, mais ce n'est valable que pour les temps de moins de 24 heures, ça devrait être assez même pour un gros marathon :lol:
Surtout que c'est une moyenne kilométrique ... même en rampant, cela devrait être bon :lol:
le timestamp 0 équivaut au 1er janvier 1970 à 1:00:00
En fait, le principe c'est que le timestamp 0 équivaut au 1er janvier 1970 à 0:00:00 à l'heure de Greenwich (UTC), donc une heure plus tard pour nous, Français.[/quote]
Belgique pour moi :roll:

Merci à tous pour vos coups de main