Problémé de temps...

Résolu
Vianneyp
Messages postés
82
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
6 janvier 2010
- 9 avril 2007 à 14:42
cs_Nicko11
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
- 13 avril 2007 à 08:25
D'abord bonjour tout le monde.
Voila,j'ai besoin de chronométrerun laps de temps en deux actions.
J'ai d'abord utiliser un Timer mais a cause d'un probléme de memoire,c'est -dans mon cas-impossible.
J'ai donc stocker l'heure de depart et l'heure de fin dans deux variable "Debut" et "Fin".
Ensuite je soustrai secondes et secondes,minutes et minutes puis enfin,heures et heures.
Ex : debut a 20:40:52 et  fin a 20:46:12.
20 - 20 = 00
46 - 40 = 06
52 - 12 = 40
L'action a donc durée 6 mins et 40 secs.
Cepandant,pour des raisons que j'ignore il arrive que le resultat soit faux alors que la plupart du temps,cela marche a merveille.
J'aimerai donc que vous jetiez un coup d' oeil a ma procédure :
Avec par exemple secA étant destiné aux secondes a la fin et minD,aux minutes au debut.
Et Td pour temps initial et Tf pour le temps a l'arrivé.Td comme Tf sont de la forme HH:MM:SS

            secA = Right(Tf, 2)
            'soit dans notre exemple secA = 12
            secD = Right(Td, 2)
            'secD = 52
            secJ = CInt(secA) - CInt(secD)
            'secJ = 52 - 12
            minD = Right(Td, 5)
            'minD = 40:52 
            minD = Left(minD, 2)
            'minD = 40,bon vous avez compris...
            minA = Right(Tf, 5)
            minA = Left(minA, 2)
            minJ = CInt(minA) - CInt(minD)
            heuA = Left(Tp, 2)
            heuD = Left(Form1.Start.Caption, 2)
            heuJ = CInt(heuA) - CInt(heuD)
Temps écoulé = (heuJ + "h " + minJ + "min et " + secJ + "sec")
Je ne sait donc pas si cela vient du code ci-dessus mais je me retrouve par moment avec des resultats comme 00:01:-47
Voyai vous un truc qui cloche ?Merci d'avance de votre aide

12 réponses

jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
9 avril 2007 à 20:38
Vu ? Compris ?
ce qui se résume donc à ceci :

  nbsecondes = DateDiff("s", datedebut, datefin)
  nbheures = nbsecondes \ 3600
  nbminutes = (nbsecondes Mod 3600) \ 60
  nbsecondes = nbsecondes Mod 60
  MsgBox nbheures & " heures " & nbminutes & " minutes" & nbsecondes & " secondes "
3
jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
9 avril 2007 à 14:53
Déjà (et je tiens à ce stade que tu y réfléchisse un peu tout seul)
Regarde ce que tu as écrit :

Ex : debut a 20:40:52 et  fin a 20:46:12.
20 - 20 = 00
46 - 40 = 06
52 - 12 = 40
Regarde le noir gras et le rouge gras : il n'y a rien, là, qui te choque ?
moi, vois-tu, je vois que les secobdes de fin sont 12 -52 = -
40 et pas +
 40
J'en déduis qu'il va me falloir oter 40 secondes des 6 minutes et que, donc, j'obtiendrai 5 minutes et 20 secondes.

J'en déduis également qu'il me faut faire le même raisonnement, éventuellement, entre les minutes (qui pourraient être négatives) et les heures !
Vas-y d'abord seul (pas difficile) et reviens avec un code d'essai commenté si tu n'y parviens pas ...
0
jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
9 avril 2007 à 14:58
J'ajoute qu'une heure de début et une heure de fin sans dates ne veulent absolument rien dire !
Imagine un peu que ton heure de début soit aujourd'hui à 23 h 59:01 et que ton heure de fin soit demain à 00 h. 00:00 !!!!
avec ton "truc"; tu obtiendrais -23 heures -59 ninutes et - 1 seconde !!!!! (ya pas photo)
0
Vianneyp
Messages postés
82
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
6 janvier 2010

9 avril 2007 à 15:36
Effectivement...il y a un petit probléme lol 
Bon c'est vrai que dans des cas comme :
15:25:25 et 16:30:45 ca pose probléme.
C'est pour sa que dans mon exemple j'ai inversé le 52 et le 12 sans meme y faire attention.
J'ai donc ajouté la ligne suivante : if secJ < 0 then secJ = -1 * jecJ ,ect...
Avec l'exemple du dessus on obtiendrai :
16 - 15 = 1
25 - 30 = -5 qui devient donc 5
25 - 45 = -20 qui deviendra lui aussi 20.
Maintenant ca fonctionne !
Mais reste le probléme des dates que je n'avais meme pas envisagé (décidement).
Je trouverai bien en moyen en isolent le jour de Date$.
Merci encore de ton aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Vianneyp
Messages postés
82
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
6 janvier 2010

9 avril 2007 à 19:37
Bon,aprés m'etre pris la tete pour rien pendant 2h,je me rend compte que tout cela ne rime absolument a rien...
Prenez par exemple 15:50:00 et 17:45:00.
Avec ma "methode" on trouverai 02:05:00 ce qui est completement faux...
J'ai,a tord,voulu traiter independament heures,minutes et secondes...
On devrai obtenir 1h et 55 mins.
Alors voila je m'en remet a vous,auriez vous une idée d'algo. pour obtenir la difference de temps entre deux heures données ?
Tout convertir en seconde bien sur mais ca me semble assez "fastidieux" non ?
0
jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
9 avril 2007 à 20:27
Oui ?
1) Une autre fois alors :
Les heures sans date ne signifient absolument rien lorsque l'on veut calculer valablement une durée écoulée entre deux mesures
2) une méthode simple : calcule la différence en secondes par datediff puis transforme ce nombre de secondes en heures, minutes et secondes.

regarde et analyse cet exemple simple :

Private Sub Command2_Click()
  datedebut = "01/01/2001 10:22:03"
  datefin = "02/01/2001 10:23:04"
  nbsecondes = 36001
  nbsecondes = DateDiff("s", datedebut, datefin)
  nbheures = nbsecondes \ 3600
  nbsecondes = nbsecondes Mod 3600
  nbminutes = nbsecondes \ 60
  nbsecondes = nbsecondes Mod 60
  MsgBox nbheures & " heures " & nbminutes & " minutes" & nbsecondes & " secondes "
End Sub

Il y a d'autres méthodes (que j'adore), mais elles sont plus longues à expliquer. Celle-ci est simple.
0
jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
9 avril 2007 à 20:50
M**** (trop vite à main levée) !
Corrige nbsecondes nbsecondes Mod 60>> nbsecondes = (nbsecondes Mod 3600) Mod 60
0
jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
9 avril 2007 à 21:12
Hé ?

Cà y est ?

Je viens de m'amuser avec une autre, si c'est dans le même mois ...
Celle-là a la marque jmf  (elle est donc rigolote)
Private Sub Command3_Click()
  datedebut = "01/01/2001 10:22:43"
  datefin = "02/01/2001 10:23:44"
  couic = DateAdd("s", DateDiff("s", datedebut, datefin), "01/01/0001")
  MsgBox Day(couic) - 1 & " jours " & Format(couic, "hh:mm:ss")
End Sub
0
cs_Nicko11
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
3
10 avril 2007 à 08:27
815295
Vianneyp

, "25 - 30  = -5 qui devient donc 5", non ca devient 60-5 soit 55.

Sinon, suis la méthode de jmfmarques, ca t'évitera des pbs d'algos.
0
Vianneyp
Messages postés
82
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
6 janvier 2010

10 avril 2007 à 19:46
Ben,merci a tout les deux,d'abord jmfmarques tes deux methodes fonctionnes .
Sinon voici une version corrigé de la miene :
 nouvelle exemple : 23:40:20 et 02:20:40 
            secA = Right(Tf, 2)
            'secA = 40
            secD = Right(Td, 2)
            'secD = 20
            secJ = CInt(secA) - CInt(secD)
            'secJ = 40 - 20 = 20
            minD = Right(Td, 5)
            'minD = 40:20
            minD = Left(minD, 2)
            'minD = 40
            minA = Right(Tf, 5)
            'minA =20:40
            minA = Left(minA, 2)
            'minA =20
            minJ = CInt(minA) - CInt(minD)
            'minJ = 20 - 40 = -20
            heuA = Left(Tf, 2)
            'heuA =  02
            heuD = Left(Td, 2)
            'heuD =  23
            heuJ = (24 - heuD) +  heuA
            heuJ = (24 - 23) + 02
            heuJ = 03

If secJ < 0 then        'faux
secJ = 60 - secJ
minJ = minJ - 1
End if
If minJ < 0 then         'vrai
minJ = 60 + minJ'minJ 60 + (-20) 40
heuJ = heuJ - 1'heuJ 03 - 1 02
End if
Temps écoulé = (heuJ + "h " + minJ + "min et " + secJ + "sec")
On a donc : 02:40:20

En fait,il y a dans ma form un composant qui est continuellement redessiné et de ce fait,un Timer n'arrive pas a suivre,j'ai remarquer qu'il prenai énormément de retard alors voila pourquoi j'aivait besoin de comparer deux heures.
 Bonne soirée
0
Vianneyp
Messages postés
82
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
6 janvier 2010

11 avril 2007 à 21:02
Bon,désolé de revenir a la charge mais je doit vraiment être nul...
Mon algo ne marchait toujours pas dans tout les cas (eh oui,il suffit d'un contre exemple...)
Alors,bien décider a terminer mon propore petit bout de code (D'ailleurs jmfmarques,ta seconde methode ne marche pas dans tout les cas non plus.) j'en suis arrivé a ceci :
Form1.Start.Caption est un label dans lequels est stocké l'heure de départ.

            heuJ = 0
            secA = Right(Tf, 2)
            secD = Right(Td, 2)
            secJ = CInt(secA) - CInt(secD)
            minD = Right(Td, 5)
            minD = Left(minD, 2)
            minA = Right(Tf, 5)
            minA = Left(minA, 2)
            minJ = CInt(minA) - CInt(minD)
            heuA = Left(Tf, 2)
            heuD = Left(Td, 2)
            Do While (heuD <> heuA)
                 If heuA = 1 Then
                 heuA = 24
                 Else                 heuA heuA heuA - 1
                 End If
            heuJ = heuJ + 1
            Loop



            If secJ < 0 Then
            secJ = 60 + secJ
            minJ = minJ - 1
            End If
            If minJ < 0 Then
            minJ = 60 + minJ
            heuJ = heuJ - 1
            End If

C'est un peu plus long mais on n'utilise ni modulo,ni conversions,ni instructions specifiques et il n'y a pas de notion de jours ni de mois.
(En partant du principe que le temps d'arrivé n'exedera jammais le lendemain,meme heure.De toute facon ce que je foit mesuré prend,au plus 3 ou 4 h.)
0
cs_Nicko11
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
3
13 avril 2007 à 08:25
Je pense que la premiere étape serait que tu refasses le calcul a la main. Car je pense a un pb de méthodologie. La méthode de jmf est toute simple (d'ailleurs tu ne dis pas ou, quand, comment elle foire) mais je vois que tu as a coeur de finir ta facon ce qui est tout a ton honneur.

Prend plusieurs heures au hasard et fais les calculs. Cela est du niveau CM1 (je m'en souviens meme). La seul difficulté est de refaire cela en VB (si difficulté il y a). La, j'ai la fleme de lire ton code car il y a des heuD, heuJ, heuA et je sais pas a quoi cela correspond.

Reprend donc avec un exemple simple sur un autre projet avec 6 champs:

H_Debut, M_Debut, S_Debut et H_Fin, M_Fin, S_Fin

Refais ton algo et si tu as encore des difficulté on reverra cela ensemble.

A+
0