2012-01-15 12 views
14

Tôi đang cố gắng tạo một chương trình đơn giản để chuyển đổi thời gian đã cho theo định dạng giây sang hh: mm: ss. Nhưng đối với một số giá trị đầu vào cụ thể, nó tạo ra một định dạng thời gian không chính xác. Đây là những gì tôi đã cố gắng:Chương trình chuyển đổi thời gian tính bằng giây thành hh: mm: ss format

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 

Nó hoạt động khi giá trị đầu vào là 30:

Enter image description here

Nó không hoạt động khi giá trị đầu vào là 31:

Enter image description here

Tôi đã làm gì sai? Làm cách nào để khắc phục sự cố này?

Trả lời

15

Có lớp trong .NET được gọi là TimeSpan giúp mã của bạn dễ dàng và thanh lịch.

Ví dụ:

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

Nó hoạt động. cảm ơn –

8

Visual Basic có hai nhà khai thác phân chia, /\. Toán tử/tạo ra một kết quả kiểu Double. Bạn tính 31/60 = 0.51666 ... Bạn tiếp theo chỉ định kết quả đó cho một số nguyên, yêu cầu làm tròn. Vì vậy, sản xuất 1, không phải 0.

Bạn muốn sử dụng toán tử \, toán tử phân chia số nguyên. Nó cắt ngắn kết quả.

+1

Dường như với tôi rằng đây là câu trả lời thực sự, mô tả chính xác điều gì sai và đưa ra giải pháp cho nó. +1! –

3

Bạn đang sử dụng các số nguyên để lưu trữ dữ liệu nhưng phân chia cho phép bạn tăng gấp đôi. Khi chuyển đổi nó trở lại số nguyên nó được làm tròn đến số vòng gần nhất. Vì vậy 0.5 trở thành 0 nhưng 0.51 trở thành 1.

1

Đối với txtformattedtime.text = ... Tôi nghĩ "ispan.tostring" sẽ làm việc là tốt.

+0

Bạn có thể giải thích thêm một chút không? –

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

Tôi hy vọng mã này sẽ hữu ích

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

Tôi biết cái này đã được trả lời trong một thời gian bây giờ, nhưng tôi nghĩ rằng tôi có thể chia sẻ giải pháp của tôi cho vấn đề trong tầm tay. Nếu bạn đặt số giây trong đối tượng TimeSpan, bạn có thể dễ dàng trích xuất ngày, giờ, phút, giây và thậm chí là số giây phân số trực tiếp bằng phương pháp TimeSpan.toString(). Sử dụng một hình thức giống hệt nhau và tên đối tượng, tôi đã sử dụng đoạn mã sau để đạt được kết quả mong muốn.

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 

Truy cập here để biết thêm thông tin về phương pháp được sử dụng.