La différence entre deux heures (24 Heurs) [Résolu]

Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 13 janv. 2017 à 12:56 - Dernière réponse : Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention
- 17 janv. 2017 à 12:41
Bonjour,
je sollicite votre aide pour régler le problème suivant :
je voudrais trouver la différence entre deux heures (le temps qu'il faut pour la deuxième heure pour atteindre la première heure), j'ai trouvé :
1er Code :
  Dim t1 As Date = "22: 59 : 30"
Dim t2 As Date = "23: 59 : 30"
Dim temps As TimeSpan = t2.Subtract(t1)
Dim H = temps.Hours
Dim M = temps.Minutes
Dim S = temps.Seconds
Label3.Text = Format(H, "00") & ":" & Format(M, "00") & ":" & Format(S, "00")

2 eme Code :
  Function CalculDifferenceHeure(ByVal HD As Object, ByVal HF As Object) As String
'HD Heure de début
'HF Heure de fin
Dim Secondes As Long
Dim Sec As String
Dim Minutes As Long
Dim Mn As String
Dim Heures As Long
Dim Hr As String
Secondes = DateDiff("s", HD, HF)
Heures = Secondes \ 3600
Minutes = Secondes \ 60
Mn = Minutes - (Heures * 60)
Hr = Heures
If Hr < 10 Then
Hr = "0" & Heures
End If
If Mn < 10 Then
Mn = "0" & Mn
End If
Sec = Secondes - (Minutes * 60)
If Sec < 10 Then
Sec = "0" & Sec
End If
CalculDifferenceHeure = String.Format(CultureInfo.InvariantCulture, "{0:00}", Hr) & " : " & String.Format(CultureInfo.InvariantCulture, "{0:00}", Mn) & " : " & String.Format(CultureInfo.InvariantCulture, "{0:00}", Sec)
End Function

Les deux codes fonction très bien, mais ils ont un petit défaut par exemple :
Si la Première heure égale à : 22 : 59 : 30
La deuxième heure égale à : 23 : 59 : 30
Alors le résultat qui s'affiche est : 01 : 00 : 00
mais normalement on doit respecter l'ordre, on doit calculer le temps qu'il faut pour la deuxième heure pour atteindre la première heure, ce que je veux dire le résultat doit être : 23 : 00 : 00 (faire un tour complet)
Merci d'avance pour toute réponse
Afficher la suite 

Votre réponse

13 réponses

vb95 1683 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 11 octobre 2018 Dernière intervention - 13 janv. 2017 à 13:25
0
Merci
bonjour Karin.code
Au niveau des heures sans précision du jour le calcul se fait au sein de la même journée
Dans ton cas si ta deuxième heure est supérieure à la première heure il faut que tu soustrait à 24 heures ton résultat d'origine pour avoir 23 heures
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 13 janv. 2017 à 15:25
Bonjour Vb95,
merci de m'avoir répondu
j'ai fait beaucoup d'essais et je suis arrivé à la solution suivante :
        Dim A() As String = Split(Label1.Text, " : ") 'Première heure
Dim B() As String = Split(Label2.Text, " : ") 'Deuxième heure
Dim temps As TimeSpan = t2.Subtract(t1)
Dim H = temps.Hours
Dim M = temps.Minutes
Dim S = temps.Seconds
If A(0) > B(0) Then
If A(1) > B(1) Then
If A(2) > B(2) Then
Label3.Text = Format(H + 23, "00") & " : " & Format(M + 60, "00") & " : " & Format(S + 60, "00")
ElseIf A(2) = B(2) Then
Label3.Text = Format(H + 23, "00") & " : " & Format(M + 60, "00") & " : " & Format(S, "00")
ElseIf A(2) < B(2) Then
Label3.Text = Format(H + 23, "00") & " : " & Format(M + 59, "00") & ": " & Format(S + 60, "00")
End If
ElseIf A(1) <= B(1) Then
If A(2) > B(2) Then
Label3.Text = Format(H + 23, "00") & " : " & Format(M + 59, "00") & " : " & Format(S + 60, "00")
ElseIf A(2) = B(2) Then
Label3.Text = Format(H + 23, "00") & " : " & Format(M + 59, "00") & " : " & Format(S + 59, "00")
ElseIf A(2) < B(2) Then
Label3.Text = Format(H + 23, "00") & " : " & Format(M + 59, "00") & " : " & Format(S + 60, "00")
End If
End If
ElseIf A(0) = B(0) Then
If A(1) > B(1) Then
If A(2) > B(2) Then
Label3.Text = Format(H + 23, "00") & " : " & Format(M + 60, "00") & " : " & Format(S + 60, "00")
ElseIf A(2) = B(2) Then
Label3.Text = Format(H + 23, "00") & " : " & Format(M + 60, "00") & " : " & Format(S, "00")
ElseIf A(2) < B(2) Then
Label3.Text = Format(H + 23, "00") & " : " & Format(M + 59, "00") & ": " & Format(S + 60, "00")
End If
ElseIf A(1) = B(1) Then
If A(2) > B(2) Then
Label3.Text = Format(H + 23, "00") & " : " & Format(M + 59, "00") & " : " & Format(S + 60, "00")
ElseIf A(2) = B(2) Then
Label3.Text = Format(H + 23, "00") & " : " & Format(M + 59, "00") & " : " & Format(S + 59, "00")
ElseIf A(2) < B(2) Then
Label3.Text = Format(H, "00") & " : " & Format(M, "00") & " : " & Format(S, "00")
End If
ElseIf A(1) < B(1) Then
Label3.Text = Format(H, "00") & " : " & Format(M, "00") & " : " & Format(S, "00")
End If
ElseIf A(0) < B(0) Then
Label3.Text = Format(H, "00") & " : " & Format(M, "00") & " : " & Format(S, "00")
End If

même si à mon avis elle n'est pas la meilleure solution
vb95 1683 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 11 octobre 2018 Dernière intervention > Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 13 janv. 2017 à 17:52
Sûr qu'il y a plus simple
Teste ceci avec un label nommé Label1
T1 et T2 sont les 2 heures que tu rentres au format String
C'est T2 qui doit atteindre T1
Tu récupères la différence dans Label1

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

Dim T1 As String = "20:30:00"
Dim T2 As String = "21:30:00"
Dim S1 As Integer = NbSecondes(T1)
Dim S2 As Integer = NbSecondes(T2)
Dim diff As Integer = S1 - S2
If diff < 0 Then diff = (24 * 3600) + diff
Dim Heures As Integer = diff \ 3600
Dim Minutes As Integer = (diff - (3600 * Heures)) \ 60
Dim Secondes As Integer = diff - ((3600 * Heures) + (60 * Minutes))
Label1.Text = Heures.ToString.PadLeft(2, "0"c) & ":" & Minutes.ToString.PadLeft(2, "0"c) & ":" & Secondes.ToString.PadLeft(2, "0"c)

End Sub

Private Function NbSecondes(Heure As String) As Integer

Dim Data() As String = Heure.Split(":"c)
Return (Convert.ToInt32(Data(0)) * 3600) + (Convert.ToInt32(Data(1)) * 60) + Convert.ToInt32(Data(2))

End Function

End Class
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention > vb95 1683 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 11 octobre 2018 Dernière intervention - 13 janv. 2017 à 20:01
Bonjour Vb95
désolé de ne pas t'avoir répondu plus tôt
Il y a pas à dire ta méthode est bien meilleur que la mienne
Merci infiniment pour ton aide
Commenter la réponse de vb95
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 13/01/2017 à 18:24
0
Merci
Bonjour,
d'autres méthodes existent également, dont l'une par utilisation du modulo.
Il n'en reste pas moins vrai qu'aucune n'est à recommander, dans la mesure où le constat d'une heure de fin inférieure à celle d'arrivée ne permet pas de garantir qu'on est simplement passé d'un jour à son seul lendemain, pas plus d'ailleurs qu'une heure de fin supérieure à celle d'arrivée ne permettrait d'établir que l'arrivée et la fin sont dans la même journée.
La rigueur s'impose en matière de développement informatique de la même manière qu'elle s'impose ailleurs. Imaginez donc un procès-verbal qui n'apporterait pas ces précisions : le jugement qui s'en servirait comme base serait à coup certain remis en cause par la partie éventuellement condamnée.
Je n'ai rien d'autre à dire que cela.
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
vb95 1683 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 11 octobre 2018 Dernière intervention - 13 janv. 2017 à 18:46
Bonsoir ucfoutu
tout ce que tu dis est fort exact !
Cependant Karin.code nous demandait ceci : je voudrais trouver la différence entre deux heures (le temps qu'il faut pour la deuxième heure pour atteindre la première heure)
il n'était nullement question de passage d'un jour à l'autre dans sa demande
Merci pour tes explications
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention > vb95 1683 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 11 octobre 2018 Dernière intervention - 13 janv. 2017 à 19:50
Bonjour vb95,
La relecture de son tout premier message continue toutefois dans ce cas à me troubler. Quelle pourrait bien être la finalité d'un tel calcul ?
J'aimerais à ce sujet les explications précises du demandeur et "sens" qu'elle n'est autre qu'un "tremplin" pour aboutir en fait au résultat d'un autre calcul.
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 13 janv. 2017 à 20:01
Bonjour ucfoutu,
merci pour ta réponse
Concernant les modules je n'ai jamais utilisé ces derniers, car mes connaissances dans ce domaine sont minces.
vb95 1683 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 11 octobre 2018 Dernière intervention > Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 13 janv. 2017 à 20:40
bonsoir Karine.code
Ucfoutu parlait de modulo et non de modules . Il faut comprendre le reste de division entière : 12 modulo 10 donne 2
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention > vb95 1683 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 11 octobre 2018 Dernière intervention - 13 janv. 2017 à 21:14
Oups, j'ai mal lu désolé
Commenter la réponse de ucfoutu
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 13 janv. 2017 à 20:01
0
Merci
merci à Vb95 et ucfoutu pour votre aide
Commenter la réponse de Karin.code
Whismeril 12106 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 16 octobre 2018 Dernière intervention - 14 janv. 2017 à 03:09
0
Merci
Bonsoir,

parfois tu t'exprime de façon un peu obscure, peut être si on exprime

Si la Première heure égale à : 22 : 59 : 30
La deuxième heure égale à : 23 : 59 : 30
Alors le résultat qui s'affiche est : 01 : 00 : 00
mais normalement on doit respecter l'ordre, on doit calculer le temps qu'il faut pour la deuxième heure pour atteindre la première heure, ce que je veux dire le résultat doit être : 23 : 00 : 00 (faire un tour complet)
Merci d'avance pour toute réponse


Comme ça

Première partie
Lundi 23:59 - Lundi 22:59 ça fait 1h

Alors que
Mardi 22:59 - Lundi 23:59 ça fait 23H et c'est ce que tu cherches.

Là on voit tout de suite ce que tu veux et la réponse est dans la question.

Le type DateTime (Date c'est une réminiscence de VB6), est comme son nom l'indique l'association d'une date et d'une heure.

Quand tu fais
  Dim t1 As Date = "22: 59 : 30"
        Dim t2 As Date = "23: 59 : 30"


VB mets automatiquement une date (celle du PC au moment de l'exécution) et donc calcule "Lundi 23:59 - Lundi 22:59", si tu veux que le calcul inverse se fasse, il suffit de préciser la date.

  Dim t1 As DateTime  = DateTime.Parse("02/01/2017 22: 59 : 30")
        Dim t2 As DateTime  = DateTime.Parse("01/01/2017 23: 59 : 30")
Dim temps As TimeSpan = t1 - t2


Et là, y'a pas de modulo à gérer.
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 17 janv. 2017 à 12:41
Bonjour Whismeril,
pour éviter toute complication on précise les dates, c'est une bonne idée
merci
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.