additionner des durées en heure, minute et seconde

Je ne me souviens plus bien du besoin,
Qu’est-ce que tu veux à la fin de la boucle?
Ce qu’il me semble c’est que dans ta fonction add_heures tu passes #champ

Message du 31/01/13 09:59
De : « Beru Beru »
A : « papounet.net »
Copie à : « Mikhael MYARA » , « francois L deplaine » , « liste SPIP »
Objet : Re: [Spip] additionner des durées en heure, minute et seconde

Il faudrait que je trouve le moyen de calculer à chaque « passage » de boucle:

La somme du #champs actif et du #champs précédent.

Beru

Merci de ta proposition.

J’ai simplifié le code et adapté à ce que je proposais. Cela donnerait cela.

Si je ne me trompe pas et si j’ai bien compris:


#SET{somme,0}
2008} {surtitre=« double »}>

#SET{somme,#EVAL{add_heures(‹ 12:04:43 ›,‹ 1:54:8 ›)}}

#GET{somme}


La question que je me pose c’est: Où vais-je introduire mon champs ?
Un truc du genre: #champs + #champs (+1) ?

Je ne vois pas trop à vrai dire.

Beru

Voilà une boucle où la somme des heures s’affiche en dessous d’un article (boucle initialement écrite par JC Villeneuce pour ESCAL (V2)et modifiée pour mes besoins).

[(#REM) feuille de style pour l’onglet Bienvenue ]

#TEXTE

#SET{somme,#EVAL{add_heures(‹ 12:04:43 ›,‹ 1:54:8 ›)}}
#GET{somme}

Le code de calcul des deux fonctions, que tu as donné pour la sommation des heures, est collé dans mes_fonctions.php placé dans le répertoire « squelettes »

J’ai testé avec un spip 2.1.19 en local avec easyphp.

Message du 28/01/13 10:41

De : « Beru Beru »
A : « papounet.net »
Copie à : « Mikhael MYARA » , « francois L deplaine » , « liste SPIP »

Objet : Re: [Spip] additionner des durées en heure, minute et seconde

Je suis toujours sur mon prob!

:wink:

J’ai trouvé cela qui fonctionne:


function add_heures($heure1,$heure2){

$secondes1=heure_to_secondes($heure1);
$secondes2=heure_to_secondes($heure2);
$somme=$secondes1+$secondes2;
//transfo en h:i:s
$s=$somme % 60; //reste de la division en minutes => secondes
$m1=($somme-$s) / 60; //minutes totales
$m=$m1 % 60;//reste de la division en heures => minutes
$h=($m1-$m) / 60; //heures
$resultat=$h."H ".$m.« mn « .$s.« s »;
return $resultat;
}
function heure_to_secondes($heure){
$array_heure=explode( »: »,$heure);
$secondes=3600*$array_heure[0]+60*$array_heure[1]+$array_heure[2];
return $secondes;
}

$heure_1=‹ 12:04:43 ›;
$heure_2=‹ 14:57:07 ›;
echo 'La somme de ‹ .$heure_1. › et de ‹ .$heure_2. › est: '.add_heures($heure_1,$heure_2);
?>


Mais je n’arrive pas à y inclure ma boucle.

Qui ressemble à cela pour l’instant:

#SET{total,0}

#SET{total, #GET{total}|plus{#CHAMPS}}

total : #GET{total}

Beru

Comme ki dirait yaka faucon!

C’est du code à écrire avec le langage de PHP, regarde là : http://php.net/manual/fr/langref.php
et à appeler dans les bonnes boucles!

Message du 10/01/13 18:31

De : « Beru Beru »
A : « Mikhael MYARA »
Copie à : « papounet.net » , « francois L deplaine » , « liste SPIP »

Objet : Re: [Spip] additionner des durées en heure, minute et seconde

Merci de ta réponse.

Et comment je fais rentrer ça dans une boucle SPIP?

Beru

ca semble plus simple de tout convertir en secondes :

t = h3600+m60+s

puis de convertir le temps obtenu en h m s. si t est le temps en secondes :

h = t/3600

r1 = modulo(t,3600)

m = r1/60

s = modulo(r1/60)

où « modulo » serait une fonction « reste » de la division entière (opérateur « % » en C)

Bon après tout ce que j’ai lu, le besoin est simplement d’aditionner des temps qui ont un format du type xxh yym zzs!

Y-a-pas de secret, on additionne d’abord les seconde et tout ce qui est au dessus de 60, il faut le convertit en heures et minutes.
Puis on additionne les minutes et tout ce qui est au dessus de 60 on le convertit en heures
On additionne enfin les heures et quand c’est au dessus de 24 on le convertit en jours. Il faut faire un peut de programmation !
Sinon tu convertit tous tes temps en secondes; t’aditionne le tout et tu reconvertit en heures, minutes et secondes!

bon courage!

Message du 05/01/13 15:41

De : « Beru Beru »
A : « francois L deplaine »
Copie à : « liste SPIP »
Objet : Re: [Spip] additionner des durées en heure, minute et seconde

Merci pour ces liens.

Hélas je n’ai pas su trouver mon bonheur.

Je précise que je cherche à additionner des durées (indépendamment de tout problème de date).

Par ex, cela pourrait être: 30h + 2h25 + 4h58

Beru

http://contrib.spip.net/Utilisation-des-filtres-de-date

http://forum.spip.net/fr_231956.html

http://www.spip.net/en_article5533.html

De : Beru Beru [mailto:beru59@gmail.com]

Envoyé : vendredi 4 janvier 2013 19:08
À : Stéphane Santon
Cc : liste SPIP
Objet : Re: [Spip] additionner des durées en heure, minute et seconde

Tu aurais un petit exemple de snythaxe pour transformer, par ex la durée 01:12:25 en 72 minutes ou 4345 secondes, et compatible avec Spip ?

Beru

Bonjour,

Transformer en TimeStamp (nb de secondes depuis 1/1/1970) en regardant les fonctions de Php qui peuvent toutes être utilisées comme filtre Spip.
http://php.net/manual/fr/function.strtotime.php
http://php.net/manual/fr/ref.datetime.php

Comment additionner des durées?

Je m’explique:

Dans ma base chaque enregistrement à une durée pour lequel j’ai créé un
champs: duree
de type hh:mm:ss

J’ai utilisé le code suivant:

#SET{total,0}

[(#SET{total, #GET{total}|plus{#DUREE}})]

total : #GET{total}

Cela fonctionne mais uniquement pour les heures. Par ex:
1h25 + 1h45 + 2h12
donne le résultat 4h
et non 5h22

Faut-il transformer avant calcul les durées en minutes (par ex 1h25
devient 85 mn) ?

Merci de vos avis et conseils,

Beru


Stéphane

BTS Electrotechnique *** http://enselec.santonum.eu
Les Voisins Spipeurs * http://www.voisins-spipeurs.net


liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
http://archives.rezo.net/spip.mbox/

Documentation de SPIP : http://www.spip.net/

Irc : de l’aide à toute heure : http://spip.net/irc


liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
http://archives.rezo.net/spip.mbox/

Documentation de SPIP : http://www.spip.net/

Irc : de l’aide à toute heure : http://spip.net/irc

[ (pas de nom de fichier) (0.3 Ko) ]

_______________________________________________

liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
http://archives.rezo.net/spip.mbox/

Documentation de SPIP : http://www.spip.net/

Irc : de l’aide à toute heure : http://spip.net/irc

Objectif:
Je souhaite additionner plusieurs articles dont le contenu d’un champs contient des durées.

Comment mettre dans ma fonction qui hors contexte, une commande de type #CHAMPS ?

Il faudrait que je trouve le moyen de passer dans une variable à chaque passage de la boucle.

Beru

Le 31/01/13 13:01, Beru Beru a écrit :

Je souhaite additionner plusieurs articles dont le contenu d'un champs
contient des durées.

en reprenant ta fonction déjà énoncée (à poser dans le fichier
squelettes/mes_fonctions.php) :

<?php
function plus_temps($deja, $ajout) {
   $secondes = en_secondes($deja) + en_secondes($ajout);
   $s = $secondes % 60;
   $minutes = ($secondes - $s) / 60;
   $m = $minutes % 60;
   $h = ($minutes - $m) / 60;
   return sprintf("%1$02d:%2$02d:%3$02d", $h, $m, $s);
}
function en_secondes($val) {
   if (preg_match("#^(\d+):(\d+):(\d+)$#", trim($val), $match)) {
     return $match[3] + (60 * $match[2]) + (3600 * $match[1]);
   }
   return 0;
}
?>

la boucle dans le squelette pourrait ressembler à :

#SET{tot_duree, 0:0:0}
<BOUCLE_d(ARTICLES)>
   [(#SET{tot_duree, #GET{tot_duree}|plus_temps{#DUREE}})]
</BOUCLE_d>
<p>
Durée totale : #GET{tot_duree}
</p>

attention :
je fais l'hypothèse que ton champ #DUREE est de type 'time' en bdd ;
le résultat de la boucle est donné en heures:minutes:secondes ;
secondes et minutes varient de 00 à 59 et heures de 00 à l'infini
(il est ainsi possible d'obtenir 185:18:42 par exemple).

J’ai testé.

Je n’ai pas d’erreur mais j’ai 0:0:0 comme résultat.

Beru

Le 01/02/13 14:05, Beru Beru a écrit :

Je n'ai pas d'erreur mais j'ai 0:0:0 comme résultat.

- les données retournées par #DUREE sont-elles bien sous la forme
12:34:56 ?

- le #SET{tot_duree, 0:0:0} est-il bien en-dehors de la BOUCLE ?

- un simple affichage dans la BOUCLE de #DUREE renvoit-il bien
les valeurs attendues ?

Oui aux trois questions:

Voici d’ailleurs la boucle:

Je me pose une question, n'y aurait-il pas moyen d'utiliser les
fonctions MySQL dans une boucle SPIP. Ca pourrait être intéressant que
SPIP accepte les fonctions MySQL dans son système de boucles (comme
les fonctions PHP dans les filtres). Ex :

<BOUCLE_duree(ARTICLES){SEC_TO_TIME(SUM(TIME_TO_SEC(duree))) AS total_duree}>
#_duree:TOTAL_DUREE
</BOUCLE_duree>

Cela dit avec le système de pipelines, il ya moyen de bidouiller les
requêtes MySQL et j'ai donc essayé sur la problématique de Béru, mais
sans succès (ma requête est bonne, l'affichage, non, sans doute parce
que c'est un champs non déclaré). Si un spécialiste de SPIP passe par
là, avec ça dans le debug ma requête est bonne mais le résultat n'est
pas renvoyé (la requête copier-coller dans phpmyadmin affiche le bon
résultat) donc que faudrait-il corriger (je précise que c'est pour
répondre à Béru mais que je trouvais la problématique intéressante,
mais comme je bloque à cet endroit, je préfère demander) :

mes_options.php

function duree_articles($boucle){
  if($boucle->id_boucle=='_duree') // On teste si la boucle s'appelle _duree
    {
    $boucle->select=
'SEC_TO_TIME(SUM(TIME_TO_SEC('.$boucle->id_table.'.duree))) AS
total_duree'; // On met les champs TIME en secondes, on les additionne
puis on les repasse en champs TIME 00:00:00
    
    }
  return $boucle;
}
$GLOBALS['spip_pipeline']['pre_boucle'] .= "|duree_articles";

<BOUCLE_duree(ARTICLES)>
#_duree:TOTAL_DUREE
</BOUCLE_duree>

Merci d'avance. @+

Benjamin Tricault

Le 1 février 2013 14:39, Beru Beru <beru59@gmail.com> a écrit :

Oui aux trois questions:

Voici d'ailleurs la boucle:
____________________
#SET{somme, 0:0:0}
     <BOUCLE_duree(ARTICLES) >
     [(#SET{somme, #GET{somme}|plus_temps{#DUREE}})]
      </BOUCLE_duree>
#GET{somme}
____________________

Le champs #DUREE est de type "time" (vérifer avec phpmyadmin)

Beru

Denis,

Cela fonctionne!

J’ai juste changé la dernière ligne de ta fonction

return $secondes; (au lieu de return 0; )

Merci infiniment

Beru

Le 01/02/13 17:26, Beru Beru a écrit :

J'ai juste changé la dernière ligne de ta fonction
   return $secondes; (au lieu de return 0; )

heu...
il y a 2 fonctions hein ? différentes.
et $secondes dans la deuxième n'existe pas.

Je ne pas sur de saisir ce que tu veux dire.
:wink:

Mon changement concerne la fonction:
function en_secondes

Beru

Le 01/02/13 19:03, Beru Beru a écrit :

Mon changement concerne la fonction:
function en_secondes

tu disais :

Le 01/02/13 17:26, Beru Beru a écrit :
  J'ai juste changé la dernière ligne de ta fonction

    return $secondes; (au lieu de return 0; )

je fais remarquer que dans la fonction en_secondes,
la variable $secondes n'existe pas.

:wink:

Ah bon!

Effectivement, j’ai revérifié.

Cela marche avec ta fonction telle que tu l’avais mise.

Ma modif n’empêchait pas de marcher mais c’est pas cela qui permettait que cela marche.
J’ai du être victime d’un raffraichissement, d’un recalcul qui a pu me faire croire des choses inexactes.

J’ai une question à propos de cette fonction:

Le nombre d’heures est-il plafonné ?

Je veux dire est-ce qu’il pourrait afficher: 130h par ex ,

Beru

Le 02/02/13 11:20, Beru Beru a écrit :

Le nombre d'heures est-il plafonné ?
Je veux dire est-ce qu'il pourrait afficher: 130h par ex ,

comme je disais le 31 janvier 2013 à 23:40 :
<cite>
   le résultat de la boucle est donné en heures:minutes:secondes ;
   secondes et minutes varient de 00 à 59 et heures de 00 à l'infini
   (il est ainsi possible d'obtenir 185:18:42 par exemple).
</cite>

et si on voulait exprimer le résultat en jours, heures, minutes etc.
je pense que le mieux serait alors d'en passer par les fonctions de
date de php.

Merci
:wink: