J'essaie de faire un programme simple pour convertir le temps donné en secondes au format hh: mm: ss. Mais pour certaines valeurs d'entrée particulières, il produit un format d'heure incorrect. Voici ce que j'ai essayé:
Public Class Form1
Dim Hours, Minutes, Seconds As Integer
Private Sub btnReset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReset.Click
lblHours.Text = "00"
lblMinutes.Text = "00"
lblSeconds.Text = "00"
txtTimeSeconds.Text = ""
txtFormattedTime.Text = ""
End Sub
Private Sub btnCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalculate1.Click
Seconds = Integer.Parse(txtTimeSeconds.Text)
Hours = Seconds / 3600
Seconds = Seconds Mod 3600
Minutes = Seconds / 60
Seconds = Seconds Mod 60
lblHours.Text = Hours.ToString.PadLeft(2, "0"c)
lblMinutes.Text = Minutes.ToString.PadLeft(2, "0"c)
lblSeconds.Text = Seconds.ToString.PadLeft(2, "0"c)
txtFormattedTime.Text = Hours.ToString.PadLeft(2, "0"c) & ":" & Minutes.ToString.PadLeft(2, "0"c) & ":" & Seconds.ToString.PadLeft(2, "0"c)
End Sub
End Class
Cela fonctionne lorsque la valeur d'entrée est 30:
Cela ne fonctionne pas lorsque la valeur d'entrée est 31:
Qu'est ce que j'ai mal fait? Comment puis-je résoudre ce problème?
Il existe une classe en .NET appelée TimeSpan qui rend votre code simple et élégant.
Exemple:
dim iSecond as double = 0 'Total number of seconds
Dim iSpan As TimeSpan = TimeSpan.FromSeconds(iSecond)
lblHours.Text = iSpan.Hours.ToString.PadLeft(2, "0"c)
lblMinutes.Text = iSpan.Minutes.ToString.PadLeft(2, "0"c)
lblSeconds.Text = iSpan.Seconds.ToString.PadLeft(2, "0"c)
txtFormattedTime.Text = iSpan.Hours.ToString.PadLeft(2, "0"c) & ":" & _
iSpan.Minutes.ToString.PadLeft(2, "0"c) & ":" & _
iSpan.Seconds.ToString.PadLeft(2, "0"c)
Visual Basic a deux opérateurs de division, /
et \
. L'opérateur/produit un résultat de type Double. Vous calculez 31/60 = 0,51666 ... Vous affectez ensuite ce résultat à un entier, qui nécessite un arrondi. Produisant ainsi 1, pas 0.
Vous souhaitez utiliser le \
opérateur, l'opérateur de division entière. Il tronque le résultat.
J'espère que ce code vous sera utile
Dim ts As TimeSpan = TimeSpan.FromSeconds(227) 'or --> Dim ts As New TimeSpan(0, 0, 0, 227, 0)
Dim mydate As DateTime = New DateTime(ts.Ticks)
MessageBox.Show(mydate.ToString(("HH:mm:ss")))
Vous utilisez des entiers pour stocker vos données mais la division vous donne des doubles. Lors de la reconversion en nombres entiers, il est arrondi au nombre arrondi le plus proche. Donc 0,5 devient 0 mais 0,51 devient 1.
Dim SecondsDifference as integer = 2500
Dim hms = TimeSpan.FromSeconds(SecondsDifference)
Dim h = hms.Hours.ToString
Dim m = hms.Minutes.ToString
Dim s = hms.Seconds.ToString
MsgBox("Hour:" + h + " Min:" + m + " Sec:" + s)
Pour le txtformattedtime.text = ... je pense que "ispan.tostring" fonctionnerait aussi.
Je sais que celui-ci a déjà reçu une réponse depuis un certain temps maintenant, mais j'ai pensé que je pourrais partager ma solution au problème actuel. Si vous placez le nombre de secondes dans un objet TimeSpan
, vous pouvez extraire assez facilement les jours, heures, minutes, secondes et même les fractions de seconde directement en utilisant la méthode TimeSpan.toString()
. En utilisant un formulaire et des noms d'objet identiques, j'ai utilisé le code suivant pour obtenir les résultats souhaités.
Public Class Form1
Private Sub btnReset_Click(sender As Object, e As EventArgs) Handles btnReset.Click
lblHours.Text = "00"
lblMinutes.Text = "00"
lblSeconds.Text = "00"
txtTimeSeconds.Text = ""
txtFormattedTime.Text = ""
End Sub
Private Sub btnCalculate_Click(sender As Object, e As EventArgs) Handles btnCalculate.Click
Dim tsSeconds = TimeSpan.FromSeconds(Convert.ToDouble(txtTimeSeconds.Text))
lblHours.Text = tsSeconds.ToString("hh")
lblMinutes.Text = tsSeconds.ToString("mm")
lblSeconds.Text = tsSeconds.ToString("ss")
txtFormattedTime.Text = tsSeconds.ToString("hh\:mm\:ss")
End Sub
End Class
Visitez ici pour plus d'informations sur la méthode utilisée.