Débutant : fonction pour transformer un temps en secondes en jour heure minute seconde

Soyez le premier à donner votre avis sur cette source.

Vue 9 644 fois - Téléchargée 303 fois

Description

Voila ce script (non-dynamique) en PHP est on ne peut plus simple, il permet de passer d'un temps exprimé en secondes (mettons 125000), donc très logique un temps enregistré dans une BDD sous la forme int (entier), en un horaire affichable sur un page.

Son fonctionnement =>
1ere étape :
Il retranche le nombre de jours au compteur de secondes et crée une variable $jour.
Il retranche le nombre d'heures au compteur de secondes et crée une variable $heure.
Il retranche le nombre de minutes au compteur de secondes et crée une variable $minute.
Il crée une variable $secondes avec ce qu'il reste.

2eme étape :
Il rajoute les 0 manquants aux valeurs en dessous de 10 pour les rendre affichables.

3eme étape :
Il sélectionne l'affichage des données pour éviter d'en afficher trop, du genre temps = 0j 00:00:10, mais pour afficher seulement 00:10 (ou personnalisable, bien sur).

et il retourne la valeur dans une variable de type chaîne de caractère.

Source / Exemple :


<!-- fonction de conversion secondes => Jour Heure Minute Seconde - Par MonkeyIsBack le 13 novembre 2009 -->
<?php
// Fonction convertir secondes en heures
function Convert_Sec_JHms($Seconde)
{
	// Transformation Secondes en Jour Heure minute seconde
	while ($Seconde >= 86400)
	{$Jour = $Jour + 1; $Seconde = $Seconde - 86400;}
	while ($Seconde >= 3600)
	{$Heure = $Heure + 1; $Seconde = $Seconde - 3600;}
	while ($Seconde >= 60)
	{$Minute = $Minute + 1; $Seconde = $Seconde - 60;}
	
	// Ajout des zéros au cas où l'affichage soit en dessous de 10
	if ($Heure < 10)
	{$Heure = '0'.$Heure;}
	if ($Minute < 10 AND $Minute > 0)
	{$Minute = '0'.$Minute;}
	if ($Minute == 0)
	{$Minute = '00';}
	if ($Seconde < 10)
	{$Seconde = '0'.$Seconde;}
	
	// Retourne une variable la plus petite possible
	if ($Jour > 0)
	{$Convert = $Jour.'j '.$Heure.':'.$Minute.':'.$Seconde; return $Convert;}
	elseif ($Heure > 0)
	{$Convert = $Heure.':'.$Minute.':'.$Seconde; return $Convert;}
	elseif ($Minute > 0)
	{$Convert = $Minute.':'.$Seconde; return $Convert;}
	else
	{$Convert = '00:'.$Seconde; return $Convert;}
}?>

Conclusion :


Conclusion :

Pour appeller la fonction, il suffit de faire :

<?php $TempsJHms = function Convert_Sec_JHms(12500);
echo $TempsJHms; // affiche 20:00 ?>

ou, plus simple mais plus risqué pour le bon fonctionnement du code :

<?php echo Convert_Sec_JHms(150200); // affiche 1j 17:43:20 ?>

Bien sur, on peut s'en servir très facilement avec une variable

Convert_Sec_JHms($Valeur);

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

lefter
Messages postés
63
Date d'inscription
lundi 7 juin 2004
Statut
Membre
Dernière intervention
16 mai 2009
-
Un code un peu plus court :

function Convert_Sec_JHms($Seconde){
return (floor($Secondes/86400)).'j '.date('G',$Secondes).':'.date('i',$Secondes).':'.date('s',$Secondes);
}
lefter
Messages postés
63
Date d'inscription
lundi 7 juin 2004
Statut
Membre
Dernière intervention
16 mai 2009
-
function Convert_Sec_JHms($Seconde){
if ($Secondes>86400)
return (floor($Secondes/86400)).'j '.date('G',$Secondes).':'.date('i',$Secondes).':'.date('s',$Secondes);
return date('G',$Secondes).':'.date('i',$Secondes).':'.date('s',$Secondes);
}
MonkeyIsBack
Messages postés
9
Date d'inscription
vendredi 13 novembre 2009
Statut
Membre
Dernière intervention
27 juin 2011
-
Effectivement ! La fonction date ... serais-je bète ...

J'ai toute fois un doute, je me demande ce qui est le plus performant. Appeler une fonction complexe cinq fois de suite ou effectuer de simples calculs de variables ^^...

Sinon ta solution est bien plus propre en effet ;-)
MonkeyIsBack
Messages postés
9
Date d'inscription
vendredi 13 novembre 2009
Statut
Membre
Dernière intervention
27 juin 2011
-
Erf il n'y a pas de fonction éditer :S

Je me suis demandé si quelques simples calculs de variables n'étaient pas plus rapides qu'appeller la fonction date, à ce sujet, j'ai donc décidé de me pencher sur la question et ai réalisé un simple benchmark ...

le voici pour les deux fonctions, la tienne et la mienne (je n'ai d'ailleurs même pas testé l'affichage de la tienne, j'ai copié la deuxième uniquement ^^...

Voici ce que PHP me retourne :

Premiere fonction :12.383121 milliseconde pour 10 000 executions
Deuxieme fonction :16.192253 milliseconde pour 10 000 executions

et le code du bench

function Convert_Sec_JHmsA($Seconde)
{
// Transformation Secondes en Jour Heure minute seconde
while ($Seconde >= 86400){$Jour $Jour + 1; $Seconde $Seconde - 86400;}
while ($Seconde >= 3600){$Heure $Heure + 1; $Seconde $Seconde - 3600;}
while ($Seconde >= 60){$Minute $Minute + 1; $Seconde $Seconde - 60;}

// Ajout des zéros au cas où l'affichage soit en dessous de 10
if ($Heure < 10)
{$Heure = '0'.$Heure;}
if ($Minute < 10 AND $Minute > 0)
{$Minute = '0'.$Minute;}
if ($Minute == 0)
{$Minute = '00';}
if ($Seconde < 10)
{$Seconde = '0'.$Seconde;}

// Retourne une variable la plus petite possible
if ($Jour > 0)
{$Convert = $Jour.'j '.$Heure.':'.$Minute.':'.$Seconde; return $Convert;}
elseif ($Heure > 0)
{$Convert = $Heure.':'.$Minute.':'.$Seconde; return $Convert;}
elseif ($Minute > 0)
{$Convert = $Minute.':'.$Seconde; return $Convert;}
else
{$Convert = '00:'.$Seconde; return $Convert;}
}

function Convert_Sec_JHmsB($Seconde){
if ($Secondes>86400)
return (floor($Secondes/86400)).'j '.date('G',$Secondes).':'.date('i',$Secondes).':'.date('s',$Secondes);
return date('G',$Secondes).':'.date('i',$Secondes).':'.date('s',$Secondes);
}

$i = 0;
$timeparts = explode(' ',microtime());
$starttime = $timeparts[1].substr($timeparts[0],1);
while ($i< 1000){
++$i;
$randA = rand(0, 500000);
Convert_Sec_JHms($randA);
}
$timeparts = explode(' ',microtime());
$endtime = $timeparts[1].substr($timeparts[0],1);
echo 'Premiere fonction :',bcsub($endtime,$starttime,6),' milliseconde pour 10 000 executions
';

$i = 0;
$timeparts = explode(' ',microtime());
$starttime = $timeparts[1].substr($timeparts[0],1);
while ($i< 1000){
++$i;
$randB = rand(0, 500000);
Convert_Sec_JHmsB($randB);
}
$timeparts = explode(' ',microtime());
$endtime = $timeparts[1].substr($timeparts[0],1);
echo 'Deuxieme fonction :',bcsub($endtime,$starttime,6),' milliseconde pour 10 000 executions';
MonkeyIsBack
Messages postés
9
Date d'inscription
vendredi 13 novembre 2009
Statut
Membre
Dernière intervention
27 juin 2011
-
PS : zut, n'ayant pas bougé ma propre fonction d'où elle était (dans un include, c'est une fonction dont moi même je me sers), le résultat c'est que le code que j'ai filé au dessus est faux =>

Convert_Sec_JHmsA($randA);

Dans la boucle ;)

Note : le temps d'execution d'une seule fois les fonctions : (puisqu'on y est ><) et donc approximativement :
Calcul précédent de 10 000 fois la fonction - 10 000 génération d'aléatoire & boucle :P 12.383121 - 0.005005 secondes / 10 000> 1,2 milliseconde pour une execution de ma fonction, et 1,6 pour la sienne ^^

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.