Multiplication d'une durée [Résolu]

Signaler
Messages postés
31
Date d'inscription
vendredi 6 février 2009
Statut
Membre
Dernière intervention
20 janvier 2010
-
PCPT
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
-
Bonjour,
Alors j'ai eu beau chercher, je n'ai rien trouvé ...

j'ai une variable ou une textbox qui a pour valeur une durée (par exemple : 00:18:00 pour 18minutes :) )

J'aimerais multiplier cette valeur par un coefficient, par exemple 4.24264069 pour obtenir 1:16:22.

Comment je dois procéder dans mon code, car j'ai toujours un problème de type de données...

Merci d'avance !

17 réponses

Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
salut,


une autre idée :


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim sTime As String = "00:18:00"

        Dim tsTime As TimeSpan = DateTime.Parse(sTime).TimeOfDay
        Dim dTime As Double = (tsTime.Seconds + (tsTime.Minutes * 60) + (tsTime.Hours * 3600)) * 4.24264069

        Dim tsRes As TimeSpan = DateTime.FromOADate(dTime).TimeOfDay

        MessageBox.Show(String.Format("{0}:{1}:{2}", tsRes.Hours, tsRes.Minutes, Convert.ToInt16(tsRes.Seconds)))
    End Sub


par contre j'obtiens 1:14:48 (avec l'arrondi des secondes)

++
[hr]
Messages postés
140
Date d'inscription
mardi 25 novembre 2003
Statut
Membre
Dernière intervention
1 novembre 2010
5
Bonjour,
je me permets de compléter le code de PCPT avec un code de jmfmarques :

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim sTime As String = "00:18:00"

        Dim tsTime As TimeSpan = DateTime.Parse(sTime).TimeOfDay
        Dim dTime As Double = (tsTime.Seconds + (tsTime.Minutes * 60) + (tsTime.Hours * 3600)) * 4.24264069

        Dim tsRes As TimeSpan = DateTime.FromOADate(dTime).TimeOfDay

        Dim nbsecondes As Integer
        Dim nbjours As Integer
        Dim nbheures As Integer
        Dim nbminutes As Integer

        nbsecondes = dTime
        nbjours = nbsecondes \ 86400
        nbheures = (nbsecondes Mod 86400) \ 3600
        nbminutes = (nbsecondes Mod 3600) \ 60
        nbsecondes = (nbsecondes Mod 3600) Mod 60
        MsgBox(nbjours & " jours " & nbheures & " heures " & nbminutes & _
        " minutes" & nbsecondes & " secondes ")

    End Sub
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
? cdate(cdate("00:18:00") * 4.24264069)
01:16:22



Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
31
Date d'inscription
vendredi 6 février 2009
Statut
Membre
Dernière intervention
20 janvier 2010

Merci pour ta réponse Renfield,

je viens de tester, mais il me sort l'erreur suivante :

Erreur 1 L'opérateur '*' n'est pas défini pour les types 'Date' et 'Long'.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
OK, pardon, j'avais pas vu que tu codes en .NET

en ce cas faudra le faire a la main :

repasser ta durée en nomber de secondes,
le multiplier par ton coefficient.

repasser du nombre de secondes obtenu en durée en Heure minutes

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
60
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
6 septembre 2012
2
peut-être
Dim dteDate As DateTime
dteDate = DateTime.FromOADate(CDate(TextBox1.Text).ToOADate * 4.24264069)
        
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
helas non, ca créé un décalage.

j'ai testé :

MessageBox.Show(Date.FromOADate((Date.Parse("00:18:00").ToOADate) * 4.24264069).ToString("hh:mm:ss"))

ca donne 11:32:25


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
repasser ta durée en nombre de secondes,
le multiplier par ton coefficient


ce qu'il est recommandé de vfaire également bsous VB6

Démonstration du pourquoi (sous VB6)

MsgBox CDate(CDate("06:18:00") * 4.24264069)


Que le résultat dépasse 23 h 59 et nous voilà mal barrés !
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
en décomposant :

        Dim dIn As Date
        Dim dOut As New Date
        dIn = Date.Parse("00:18:00")
        dOut = dOut.AddSeconds((dIn.Hour * 3600 + dIn.Minute * 60 + dIn.Second) * 4.24264069)

        MessageBox.Show(dOut.ToString("hh:mm:ss"))


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
sur qu'après, faudrait prendre en compte le nombre de jours, etc.


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
cela s'"arrêtera au nombre de jours.
Au delà, on passe à des notions calendaires qu'une durée ne saurait prendre en compte.

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
Messages postés
31
Date d'inscription
vendredi 6 février 2009
Statut
Membre
Dernière intervention
20 janvier 2010

Merci pour toutes ces précisions :)

Cependant les secondes, minutes et heures me donnent par exemple 3 au lieu de 03...

Existe t-il une fonction pour déterminer le format "00" d'une variable?
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
la fonction FORMAT oui

MessageBox.Show(String.Format("{0:00}:{1:00}:{2:00}", tsRes.Hours, tsRes.Minutes, Convert.ToInt16(tsRes.Seconds)))
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Bonjour, christoni

Pourquoi donc y mêler le code de mon ami jmfmarques (principalement fait pour VB6) alors que celui de PCPT va apparemment fort bien pour VB.Net ?


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
Messages postés
140
Date d'inscription
mardi 25 novembre 2003
Statut
Membre
Dernière intervention
1 novembre 2010
5
Bonsoir ucfoutu,
Sauf que :
« par contre j'obtiens 1:14:48 (avec l'arrondi des secondes) »
dixit PCPT
En suivant la bonne idée de celui ci, j’ai de suite pensé à votre ami et balancé sa conversion qui donne le bon résultat : 1h 16 mn 22 sec.
Evidemment ceci demande à être optimisé, à défaut d’une proposition d’un code pur .net.
Pensez vous toujours que « VBA, VB6 et VB.Net sont 3 choses différentes, avec 3 syntaxes différentes. » ?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Allons bon ! Je serais de toutes manières bien le tout dernier à remettre en cause ce qu'a écrit mon ami jmfmarques
Reste à transposer pour VB.Net, alors ...


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
pas compris si la nouvelle signature était juste un clin d'oeil mais ceci devrait y répondre (aussi) :

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim tsTime As TimeSpan = DateTime.Parse("00:18:00").TimeOfDay
        Dim dTime As Double = (tsTime.Seconds + (tsTime.Minutes * 60) + (tsTime.Hours * 3600)) * 4.24264069
        MessageBox.Show(String.Format("{0:00}:{1:00}:{2:00}", Convert.ToInt32(dTime) \ 3600, Convert.ToInt32(dTime Mod 3600) \ 60, Convert.ToInt32(dTime Mod 3600) Mod 60))
    End Sub


INFO :
et en regardant en pas à pas, c'est tsRes qui altérait le résultat, et non l'arrondi final