La différence entre deux heures (24 Heurs)

Résolu
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 - 13 janv. 2017 à 12:56
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 - 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
A voir également:

4 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
13 janv. 2017 à 13:25
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
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
Modifié par Karin.code le 13/01/2017 à 15:27
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
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
Modifié par vb95 le 13/01/2017 à 18:10
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
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 13/01/2017 à 18:24
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.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
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.
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
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.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
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
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
13 janv. 2017 à 21:14
Oups, j'ai mal lu désolé
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
13 janv. 2017 à 20:01
merci à Vb95 et ucfoutu pour votre aide
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
14 janv. 2017 à 03:09
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.
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
17 janv. 2017 à 12:41
Bonjour Whismeril,
pour éviter toute complication on précise les dates, c'est une bonne idée
merci
0
Rejoignez-nous