Multiplication d'une durée

Résolu
Neiflheim1 Messages postés 31 Date d'inscription vendredi 6 février 2009 Statut Membre Dernière intervention 20 janvier 2010 - 19 janv. 2010 à 13:46
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 20 janv. 2010 à 22:59
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

PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
19 janv. 2010 à 14:49
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]
3
cs_christoni Messages postés 140 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 1 novembre 2010 7
20 janv. 2010 à 09:47
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
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
19 janv. 2010 à 14:02
? cdate(cdate("00:18:00") * 4.24264069)
01:16:22



Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
Neiflheim1 Messages postés 31 Date d'inscription vendredi 6 février 2009 Statut Membre Dernière intervention 20 janvier 2010
19 janv. 2010 à 14:09
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'.
0

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

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
19 janv. 2010 à 14:20
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
0
fohaf Messages postés 60 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 6 septembre 2012 2
19 janv. 2010 à 14:30
peut-être
Dim dteDate As DateTime
dteDate = DateTime.FromOADate(CDate(TextBox1.Text).ToOADate * 4.24264069)
        
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
19 janv. 2010 à 14:38
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 220
19 janv. 2010 à 14:39
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.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
19 janv. 2010 à 14:43
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
19 janv. 2010 à 14:43
sur qu'après, faudrait prendre en compte le nombre de jours, etc.


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 220
19 janv. 2010 à 14:47
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.
0
Neiflheim1 Messages postés 31 Date d'inscription vendredi 6 février 2009 Statut Membre Dernière intervention 20 janvier 2010
20 janv. 2010 à 16:59
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?
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
20 janv. 2010 à 17:08
la fonction FORMAT oui

MessageBox.Show(String.Format("{0:00}:{1:00}:{2:00}", tsRes.Hours, tsRes.Minutes, Convert.ToInt16(tsRes.Seconds)))
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 220
20 janv. 2010 à 17:35
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.
0
cs_christoni Messages postés 140 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 1 novembre 2010 7
20 janv. 2010 à 21:50
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. » ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 220
20 janv. 2010 à 21:59
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
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
20 janv. 2010 à 22:59
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
0
Rejoignez-nous