2012-01-15 17 views
14

Estoy tratando de hacer un programa simple para convertir el tiempo dado en segundos al formato hh: mm: ss. Pero para algunos valores de entrada particulares produce un formato de tiempo incorrecto. Esto es lo que he intentado:Programa para convertir el tiempo en segundos a formato hh: mm: ss

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 

Funciona cuando el valor de entrada es de 30:

Enter image description here

No funciona cuando el valor de entrada es 31:

Enter image description here

¿Qué he hecho mal? ¿Como puedo solucionar este problema?

Respuesta

15

Hay una clase en .NET llamada TimeSpan que hace que su código sea fácil y elegante.

Ejemplo:

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) 
+0

Funciona. gracias –

8

Visual Basic tiene dos operadores de división, / y \. El operador/produce un resultado del tipo Doble. Calcula 31/60 = 0.51666 ... Luego asigna ese resultado a un Entero, que requiere redondeo. Por lo tanto, produce 1, no 0.

Desea utilizar el operador \, el operador de división de enteros. Trunca el resultado.

+1

Me parece que esta es la verdadera respuesta, describiendo exactamente qué es lo que está mal y presentando una solución. +1! –

3

Está utilizando números enteros para almacenar sus datos, pero la división le da dobles. Al convertirlo nuevamente en enteros, se redondea al número redondo más cercano. Entonces 0.5 se convierte en 0 pero 0.51 se convierte en 1.

1

Para el txtformattedtime.text = ... creo "ispan.tostring" funcionaría también.

+0

¿Podría explicar un poco más? –

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

espero que este código será útil

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"))) 
1

Sé que éste ya ha sido contestada por un tiempo ahora, pero pensé que podría compartir mi solución al problema en cuestión. Si coloca la cantidad de segundos en un objeto TimeSpan, puede extraer fácilmente los días, horas, minutos, segundos e incluso fracciones de segundo directamente mediante el método TimeSpan.toString(). Usando una forma idéntica y nombres de objetos, utilicé el siguiente código para lograr los resultados deseados.

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 

Visita here para obtener más información sobre el método utilizado.

Cuestiones relacionadas