秒単位の時間を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の場合は機能しません。
何が悪いのでしょうか?この問題を解決するにはどうすればよいですか?
.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)
Visual Basicには2除算演算子/
および\
があります。 /演算子は、Double型の結果を生成します。 31/60 = 0.51666を計算します...次に、その結果を整数に割り当てます。丸めが必要です。したがって、0ではなく1が生成されます。
整数除算演算子\
演算子を使用します。結果を切り捨てます。
このコードが役立つことを願っています
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")))
あなたはデータを格納するために整数を使用していますが、除算は倍を与えます。整数に戻すと、最も近い丸め数に丸められます。したがって、0.5は0になりますが、0.51は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)
txtformattedtime.text = ...の場合 "ispan.tostring"も機能すると思います。
これはすでにしばらく回答されていることは知っていますが、目の前の問題の解決策を共有できると思いました。秒数を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
使用する方法の詳細については、 こちら にアクセスしてください。