16

我正在尝试制作一个简单的程序,将以秒为单位的时间转换为 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 时起作用:

在此处输入图像描述

输入值为 31 时不起作用:

在此处输入图像描述

我做错了什么?我该如何解决这个问题?

4

7 回答 7

20

.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)
于 2012-01-15T10:56:39.273 回答
9

Visual Basic 有两个除法运算符,/\. / 运算符产生一个 Double 类型的结果。您计算 31 / 60 = 0.51666... 接下来将该结果分配给一个整数,这需要四舍五入。因此产生 1,而不是 0。

您想使用\运算符,整数除法运算符。它截断结果。

于 2012-01-15T10:54:44.153 回答
6

我希望这段代码有用

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")))
于 2013-11-27T14:43:00.353 回答
3

您正在使用整数来存储数据,但除法会给您加倍。将其转换回整数时,它会四舍五入到最接近的整数。所以 0.5 变成 0 但 0.51 变成 1。

于 2012-01-15T10:55:52.087 回答
2
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)
于 2013-08-29T04:27:09.080 回答
1

对于txtformattedtime.text=...我认为“ispan.tostring”也可以。

于 2013-05-22T10:00:10.390 回答
1

我知道这个问题已经回答了一段时间,但我想我可能会分享我对手头问题的解决方案。如果你把秒数放在一个对象中,你可以很容易地直接使用方法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

访问此处以获取有关所用方法的更多信息。

于 2015-12-24T20:31:22.153 回答