プロが教えるわが家の防犯対策術!

時刻と時間の計算で、どうするのが最適か教えて下さい。

1…2つの時刻、例えば「08時28分」から「17時04分」までの時間を計算し、Labelにその時間「8時間36分」と表示する

2…3つの時間、例えば「8時間36分」、「6時間08分」、「9時間54分」の合計を計算し、Labelにその合計を表示する

3…上記2番目の平均を計算し、Labelにその平均を表示する

よろしくお願いします。

A 回答 (2件)

こんにちは




1番目はどのような方法でもさほど変わりがありませんね。

2番目と3番目は時間と分だけですので、全部分に変換してから、計算後再度時間と分に変換する方法と時間の部分と分の部分を別別に計算する方法がありますが、なんとなく一度分に変換してから計算して再度時間と分に変換した方がスッキリするみたいです。




Public Class Form1
Private Sub f() Handles MyBase.Shown
Dim dt1 As DateTime = DateTime.Parse("17:04:00")
Dim dt2 As DateTime = DateTime.Parse("08:28:00")
Dim dt3 As TimeSpan = dt1 - dt2

Label1.Text = dt3.Hours.ToString & "時間" & dt3.Minutes.ToString & "分です。"

'「時」と「分」を個別に計算
Dim dt4 As DateTime = DateTime.Parse("08:36:00")
Dim dt5 As DateTime = DateTime.Parse("06:06:00")
Dim dt6 As DateTime = DateTime.Parse("09:54:00")
Dim dth As Integer = dt4.Hour + dt5.Hour + dt6.Hour '時間の合計
Dim dtm As Decimal = dt4.Minute + dt5.Minute + dt6.Minute '分の合計
Dim dt8 As Decimal = Math.Floor(dtm / 60) '分の繰り上げ
Dim dt9 As Integer = dtm Mod 60 '分の繰り上げの余り

Label2.Text = "合計は " & (dth + dt8).ToString & "時間" & dt9.ToString & "分です。"

'全部一度分に変換して計算後再度「時」と「分」に変換
Dim dt10 As Decimal = dth * 60 + dtm '時間の合計を分に変換 分の部分も足す
Dim dt11 As Decimal = Math.Floor((dt10 / 60) / 3) '分の合計を時間に変換
Dim dt12 As Decimal = (dt10 Mod 60) / 3 '分の合計を時間に変換したときの余り

Label3.Text = "平均は " & dt11.ToString & "時間" & dt12.ToString & "分です。"
End Sub
End Class
    • good
    • 0
この回答へのお礼

早速の回答をありがとうございました。
この部分に来るまでに時間がかかり、お礼が遅くなりました。申し訳ありませんでした。
非常に参考になりました。
また何かありましたら、その節もよろしくお願いします。

お礼日時:2013/02/18 10:01

.net framework 上で "時間" は TimeSpan 型を使う。


DateTime 型どうしの計算をすると、結果は自動的に TimeSpan 型で返ってくる。

(1) 2つの時刻の差
DateTime が "xx時xx分" という値を認識するとは思ってもいなかった。

Dim dt1 As DateTime = DateTime.Parse("08時28分")
Dim dt2 As DateTime = DateTime.Parse("17時04分")
Dim result As TimeSpan = dt2 - dt1
Label2.Text = String.Format("{0}時間{1}分", Math.Floor(result.TotalHours), result.Minutes)


(2) 3つの時間の合計
3つの "時間" とあったので、最初から TimeSpan を使っているが、DateTime であっても問題ないかもしれない。
合計の "時" は TimeSpan 型の Hour で取れるが、24時間を越える場合も "時" の部分しか取れないので TotalHours プロパティを使った。
TotalHours は分秒の値も少数で持っているので切り捨てている。

Dim span1 As TimeSpan = TimeSpan.Parse("8:36:0")
Dim span2 As TimeSpan = TimeSpan.Parse("6:8:0")
Dim span3 As TimeSpan = TimeSpan.Parse("9:54:0")

Dim result As TimeSpan = span1 + span2 + span3
Label4.Text = String.Format("{0}時間{1}分", Math.Floor(result.TotalHours), result.Minutes)


(3) 時間の平均
平均を算出する部分は関数にでもしておけばよいと思う。
今回はサンプル数が 3つなのでベタに書いている。
時間の合計から TotalMinutes で分に直した値で平均値を出して、それを FromMinutes で TimeSpan 型に戻している。

Dim span1 As TimeSpan = TimeSpan.Parse("8:36:0")
Dim span2 As TimeSpan = TimeSpan.Parse("6:8:0")
Dim span3 As TimeSpan = TimeSpan.Parse("9:54:0")

Dim totalValue As Double = span1.TotalMinutes + span2.TotalMinutes + span3.TotalMinutes
Dim averageMinutes As Double = Math.Floor(totalValue / 3)
Dim result As TimeSpan = TimeSpan.FromMinutes(Math.Floor(averageMinutes))
Label6.Text = String.Format("{0}時間{1}分", Math.Floor(result.TotalHours), result.Minutes)
    • good
    • 2
この回答へのお礼

早速の回答をありがとうございました。
この部分に来るまでに時間がかかり、お礼が遅くなりました。申し訳ありませんでした。
回答いただいた通りにしたところ、上手く行きました!!!ありがとうございました!
また何かありましたら、その節もよろしくお願いします。

お礼日時:2013/02/18 10:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!