web-dev-qa-db-ja.com

秒単位の時間をhh:mm:ss形式に変換するプログラム

秒単位の時間を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

何が悪いのでしょうか?この問題を解決するにはどうすればよいですか?

16
Failed_Noob

.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)
19
John Woo

Visual Basicには2除算演算子/および\があります。 /演算子は、Double型の結果を生成します。 31/60 = 0.51666を計算します...次に、その結​​果を整数に割り当てます。丸めが必要です。したがって、0ではなく1が生成されます。

整数除算演算子\演算子を使用します。結果を切り捨てます。

8
Hans Passant

このコードが役立つことを願っています

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

あなたはデータを格納するために整数を使用していますが、除算は倍を与えます。整数に戻すと、最も近い丸め数に丸められます。したがって、0.5は0になりますが、0.51は1になります。

3
Serge Bekenkamp
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)
2
Siva S Tenet

txtformattedtime.text = ...の場合 "ispan.tostring"も機能すると思います。

1
dba

これはすでにしばらく回答されていることは知っていますが、目の前の問題の解決策を共有できると思いました。秒数を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

使用する方法の詳細については、 こちら にアクセスしてください。

1
Sirach Matthews