Программа для преобразования времени в секундах в формат чч:мм:сс

Я пытаюсь сделать простую программу для преобразования времени, указанного в секундах, в формат чч: мм: сс. Но для некоторых конкретных входных значений он выдает неверный формат времени. Это то, что я пробовал:

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

Он работает, когда входное значение равно 30:

Введите здесь описание изображения

Это не работает, когда входное значение равно 31:

Введите здесь описание изображения

Что я сделал не так? Как я могу решить эту проблему?


person Failed_Noob    schedule 15.01.2012    source источник


Ответы (6)


В .NET есть класс с именем TimeSpan, что делает ваш код простым и элегантным.

Пример:

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)
person John Woo    schedule 15.01.2012

В Visual Basic есть два оператора деления, / и \. Оператор / выдает результат типа Double. Вы вычисляете 31/60 = 0,51666... ​​Затем вы присваиваете этот результат целому числу, которое требует округления. Таким образом получается 1, а не 0.

Вы хотите использовать оператор \, оператор целочисленного деления. Он усекает результат.

person Hans Passant    schedule 15.01.2012
comment
Мне кажется, что это настоящий ответ, точно описывающий, что идет не так, и предлагающее решение. +1! - person Justus Romijn; 22.05.2013

Я надеюсь, что этот код будет полезен

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")))
person JotaPardo    schedule 27.11.2013

Вы используете целые числа для хранения своих данных, но деление дает вам двойные числа. При преобразовании обратно в целые числа оно округляется до ближайшего круглого числа. Таким образом, 0,5 становится 0, а 0,51 становится 1.

person Serge Bekenkamp    schedule 15.01.2012

Для txtformattedtime.text=... я думаю, "ispan.tostring" также подойдет.

person dba    schedule 22.05.2013
comment
Не могли бы вы объяснить немного больше? - person Justus Romijn; 22.05.2013

Я знаю, что на этот вопрос уже давно дан ответ, но я подумал, что могу поделиться своим решением проблемы. Если вы поместите количество секунд в объект TimeSpan, вы можете довольно легко извлечь дни, часы, минуты, секунды и даже доли секунды напрямую, используя метод TimeSpan.toString(). Используя идентичную форму и имена объектов, я использовал следующий код для достижения желаемых результатов.

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

Посетите здесь для получения дополнительной информации об используемом методе.

person Sirach Matthews    schedule 24.12.2015