Программа для преобразования времени в секундах в hh: mm: ss format
Я пытаюсь сделать простую программу для преобразования времени, заданного в секундах, в формат 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
Он работает, когда входное значение равно 30:
![Enter image description here]()
Это не работает, когда входное значение равно 31:
![Enter image description here]()
Чем я ошибся? Как я могу исправить эту проблему?
Ответы
Ответ 1
В .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)
Ответ 2
Visual Basic имеет два оператора деления, /
и \
. Оператор/производит результат типа Double. Вы вычисляете 31/60 = 0.51666... Затем вы присваиваете этот результат целому числу, которое требует округления. Таким образом, производя 1, а не 0.
Вы хотите использовать оператор \
, оператор целочисленного деления. Он обрезает результат.
Ответ 3
Я надеюсь, что этот код будет полезен
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")))
Ответ 4
Вы используете целые числа для хранения ваших данных, но разделение дает вам удвоения. При преобразовании его в целые числа округляется до ближайшего раунда. Таким образом, 0,5 становится 0, а 0.51 становится равным 1.
Ответ 5
Для txtformattedtime.text =... Я думаю, что "ispan.tostring" также будет работать.
Ответ 6
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)
Ответ 7
Я знаю, что на это уже ответили какое-то время, но я подумал, что могу поделиться своим решением проблемы. Если вы поместите количество секунд в объект 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
Посетите здесь для получения дополнительной информации о используемом методе.