web-dev-qa-db-fra.com

Programme pour convertir le temps en secondes au format hh: mm: ss

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:

Enter image description here

Cela ne fonctionne pas lorsque la valeur d'entrée est 31:

Enter image description here

Qu'est ce que j'ai mal fait? Comment puis-je résoudre ce problème?

16
Failed_Noob

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)
19
John Woo

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.

8
Hans Passant

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")))
5
JotaPardo

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.

3
Serge Bekenkamp
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)
2
Siva S Tenet

Pour le txtformattedtime.text = ... je pense que "ispan.tostring" fonctionnerait aussi.

1
dba

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.

1
Sirach Matthews