Partage
  • Partager sur Facebook
  • Partager sur Twitter

Convertir en secondes

Résultats étranges...

Sujet résolu
    22 décembre 2011 à 8:21:33

    Bonjour à tous! :p

    Je créé actuellement un site web et j'ai besoin de convertir des secondes en minutes, heures, etc.

    J'ai un nombre n1 qui correspond des secondes après une date précise, et un nombre n2 qui correspond au nombre de secondes écoulée depuis la date de référence (on va dire d).

    Donc si vous m'avez suivi j'ai n1 < n2 car n2 est le moment actuel donc plus loin de la date référence d que n1. o_O

    Bon jusque là ça va. Pour voir combien de temps s'est écoulé depuis n1 jusqu'à n2 je fais n2 - n1. J'obtiens n secondes.

    Pour le convertir je fais n/60=x en minutes.
    ... n/3600=x en heures.
    ... etc.

    À la sortie de mon script j'ai quelque chose du genre "il y a ... secondes" si j'ai calculé en secondes.
    Vu que n2 évolue en permanence, j'ai quelque chose comme "il y a 1 seconde", "il y a 2 secondes", etc. Puis "il y a 59 secondes", "il y a 1 minute".

    Tout va bien pour passer des secondes aux minutes.

    Et pourtant, pour le passage des minutes aux heures ça me fait "il y a 59 minutes", "il y a 60 minutes", "il y a une heure". Mon raisonnement semble correct et pourtant...!

    Avez-vous une idée de ce qui peut faire ce drôle de phénomène?? Merci d'avance!

    PS: Pensez qu'il vaut mieux poster du côté "informatique"? Car mon script a peut être une erreur...

    $timestamp -> n1
    $maintenant -> n2
    $maintenant = time();
    $temps = ($maintenant - $timestamp);
    if ($temps < 60) { // Secondes
    $temps .= ' seconde';
    } elseif ($temps >= 60 && $temps < 3600) { // Minutes
    $temps = round($temps/60);
    $temps .= ' minute';
    }
    

    • Partager sur Facebook
    • Partager sur Twitter
      22 décembre 2011 à 10:43:59

      attention ton code ne fonctinone pas correctement, tu mets dans un if() les secondes et dans un autre les minutes alors qu'elle peuvent etre ensemble
      $maintenant = time();
      $temps = $maintenant - $timestamp;
      $minutes = round(($temps % 3600)/ 60);
      $heures = round($temps / 3600);
      $temps .= ' secondes';
      if($minutes != 0)
        $temps .= $minutes . ' minutes';
      if($heures != 0)
        $temps .= $heures . ' heures';
      

      ça fait longtemps que j'ai pas touché au php, et j'ai pas eu le temps d'essayer je ne suis pas sur que ca va fonctionner alors :p et taurai du mettre ca sur le forum php
      • Partager sur Facebook
      • Partager sur Twitter
        22 décembre 2011 à 10:45:28

        cela vient de l'arrondi que tu fais : si par exemple, au début du script $temps = 3590, lorsque tu calcules round($temps/60) cela calcule round(59.8333) et tu obtiens 60. Il vaudrait mieux prendre la partie entiere (si je ne me trompe pas : int($temps/60) qui va simplement tronquer ton résultat : int(59.833) donne 59.

        Détail informatique : dans ta 2eme condition, (ton elsif) inutile de tester si $temps>=60 , c'est forcément le cas vu que tu es dans le "else" du test : if($temps<60).
        • Partager sur Facebook
        • Partager sur Twitter
          22 décembre 2011 à 13:47:43

          Merci de vos réponses!

          Effectivement j'aurais plutôt du mettre ça dans le forum informatique... J'ai pas pensé que ça pouvait venir de mon code. Néanmoins il fonctionne, mais je vais tester vos solutions. Merci encore! Je pensais que c'était un truc mathématique...

          Ah et les elseif c'est parce que je veux donner soit les secondes soit les minutes etc... et pas ensemble, pour éviter de surcharger.

          EDIT: avec la fonction floor() ça marche nikel!
          • Partager sur Facebook
          • Partager sur Twitter
            22 décembre 2011 à 15:29:31

            Citation : xou816

            Ah et les elseif c'est parce que je veux donner soit les secondes soit les minutes etc... et pas ensemble, pour éviter de surcharger.


            Oui, on a bien compris. Mais ce que veut dire sebsheep, c'est que puisque tu testes d'abord if ($temps < 60), il est superflu d'écrire elseif ($temps >= 60 && $temps < 3600). Seul elseif ($temps < 3600) suffit.
            • Partager sur Facebook
            • Partager sur Twitter
              22 décembre 2011 à 15:39:36

              J'ai (un peu :D ) modifié ton code, il affiche maintenant l'écart de temps en Jours, Heures, Minutes, Secondes... et non en une seule unité, il gère le pluriel (heure, heures...) sa devrait te suffire :)



              <?php
              
              $maintenant = time();
              $temps = $maintenant - $timestamp;
              
              function Jours($sec)
              {
              	$jours = $sec / 86400;
              	$jours = floor($jours);
              
              	if($jours >  1)
              	{
              		$jours = ($jours. ' Jours');
              		return $jours;
              	}
              
              	elseif($jours ==  1)
              	{
              		$jours = ($jours. ' Jour');
              		return $jours;
              	}
              	
              }
              
              function Heures($sec)
              {
              	while($sec >= 86400)
              	{
              		$sec -= 86400;
              	}
              
              	$heures = $sec / 3600;
              	$heures = floor($heures);
              
              	if($heures >  1)
              	{
              		$heures = ($heures. ' Heures');
              		return $heures;
              	}
              
              	elseif($heures ==  1)
              	{
              		$heures = ($heures. ' Heure');
              		return $heures;
              	}
              
              }
              
              function Minutes($sec)
              {
              
              	while($sec >= 86400)
              	{
              		$sec -= 86400;
              	}
              
              	while($sec >= 3600)
              	{
              		$sec -= 3600;
              	}
              
              	$minutes = $sec / 60;
              	$minutes = floor($minutes);
              
              	if($minutes >  1)
              	{
              		$minutes= ($minutes. ' Minutes');
              		return $heures;
              	}
              
              	elseif($minutes ==  1)
              	{
              		$minutes= ($minutes. ' Minute');
              		return $minutes;
              	}
              
              }
              
              function Secondes($sec)
              {
              	while($sec >= 86400)
              	{
              		$sec -= 86400;
              	}
              
              	while($sec >= 3600)
              	{
              		$sec -= 3600;
              	}
              
              	while($sec >= 60)
              	{
              		$sec -= 60;
              	}
              
              	if($sec >  1)
              	{
              		$sec = ($sec. ' Secondes');
              		return $sec;
              	}
              
              	elseif($sec ==  1)
              	{
              		$sec = ($sec. ' Seconde');
              		return $sec;
              	}
              
              	else
              	{
              		$sec = ('0 secondes !');
              		return $sec;
              	}
              
              }
              
              if($temps >= 86400)
              {
              	$temps = Jours($temps);
              	$temps .= Heures($temps);
              	$temps .= Minutes($temps);
              	$temps .= Secondes($temps);
              }
              
              
              if($temps >= 3600 AND $temps < 86400)
              {
              	$temps = Heures($temps);
              	$temps .= Minutes($temps);
              	$temps .= Secondes($temps);
              }
              
              
              if($temps >= 60 AND $temps < 3600)
              {
              	$temps = Minutes($temps);
              	$temps .= Secondes($temps);
              }
              
              
              if($temps >= 0 AND $temps < 60)
              {
              	$temps = Secondes($temps);
              }
              
              ?>
              


              • Partager sur Facebook
              • Partager sur Twitter
                22 décembre 2011 à 16:13:11

                Comme le pluriel ne s'utilise que pour les nombres supérieurs ou égaux à 2, il faut changer $temps > 1 en $temps < 2^^

                Quoi qu'il en soit, je trouve que floor() est une mauvaise solution car 59,999 minutes sera affiché comme « 59 minutes » alors qu'il devrait l'être comme « 1 heure ».
                • Partager sur Facebook
                • Partager sur Twitter
                  22 décembre 2011 à 16:47:32

                  Le code que tu à vu n'était pas du tout fini.
                  Je viens de le terminer à l'instant, j'ai édité mon précédent post avec le nouveau code.

                  PS: Pour moi, je préfère afficher 59 Minutes et 59 secondes pour ton exemple que 1 heure, d'ailleurs la question ne se pose même pas car le timestamp étant en secondes, la précision est de l'ordre de <math>\(\frac{1}{60}\)</math> soit environ 0.02 minutes donc la limite est donc 59,98 ce qui est presque une heure, mais pas encore une ;) !
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 décembre 2011 à 17:54:28

                    Eh bé ! o_O En lisant ton code, je vois que tu es de ceux qui se disent : « Pourquoi faire simple quand on peut faire compliqué !? » :p

                    Et pour répondre à « je préfère afficher 59 Minutes et 59 secondes pour ton exemple que 1 heure », je te ferai remarquer que xou816 n'a a priori pas besoin d'un compte exact de secondes, mais d'un ordre de grandeur. D'après son post initial, il ne veut visiblement qu'une seule unité. En tout cas, à sa place, c'est bien ce que je voudrais…
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 décembre 2011 à 18:02:41

                      Merci de ta participation à ce sujet mais plutôt que de faire des suppositions, laissons l'auteur s'exprimer, peut importe ce qu'il veut faire, les modifications sont minimes si il veut n'afficher qu'une unité :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 décembre 2011 à 19:17:36

                        Que dirais-tu de diminuer ton code de plus des 3/4 ? ^^

                        <?php
                        
                        $maintenant = time();
                        $temps = $maintenant - $timestamp;
                        
                        $jours = floor($temps / (60 * 60 * 24));
                        $heures = floor(($temps % (60 * 60 * 24)) / (60 * 60));
                        $minutes = floor(($temps % (60 * 60)) / 60);
                        $secondes = $temps % 60;
                        
                        $temps_str = '';
                        
                        if ($jours > 1)
                        	$temps_str .= $jours.' jours ';
                        elseif ($jours > 0)
                        	$temps_str .= $jours.' jour ';
                        
                        if ($heures > 1)
                        	$temps_str .= $heures.' heures ';
                        elseif ($heures > 0)
                        	$temps_str .= $heures.' heure ';
                        
                        if ($minutes > 1)
                        	$temps_str .= $minutes.' minutes ';
                        elseif ($minutes > 0)
                        	$temps_str .= $minutes.' minute ';
                        
                        if ($secondes > 1)
                        	$temps_str .= $secondes.' secondes';
                        else
                        	$temps_str .= $secondes.' seconde';
                        
                        ?>
                        
                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 décembre 2011 à 19:21:01

                          On ne va pas jouer aux devinettes… Dis-moi ce que tu penses qui n'est pas juste, s'il te plaît.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Convertir en secondes

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown