|
2014/08/01(Fri) 17:27:55 編集(投稿者)
■No72927 (nkane さん) に返信 > Dim starttime1, endtime1 As DateTime > starttime1 = txtStartHour1.Text.ToString() & ":" & txtStartMinutes1.Text.ToString()
Date 型の変数に、String 型の値を放り込んではいけません。
暗黙の型変換に頼るのではなく、代入式の左辺と右辺とで、 データ型を一致させるクセをつけておきましょう。
時刻情報を扱うなら、 dt = #23:59# '「dt = #11:59:00 PM#」 dt = TimeSerial(23, 59, 0) dt = New DateTime(1, 1, 1, 23, 59, 0, 0) などと書けます。 これらは、いずれも「『西暦1年1月1日』の23時59分0秒ジャスト」を意味します。
ちなみに、 span = New TimeSpan(0, 23, 59, 0, 0) は、「0日と23時間59分0秒ジャスト」です。 Date 型と TimeSpan 型の使い分けに注意しましょう。
> 8月1日 22:00〜24:00
「日付部」を持つデータであれば、西暦も伴わせて Dim dt1 As New DateTime(2000, 8, 1, 22, 0, 0, 0) などと管理すればよいかと。
日付部を持たず、「時間間隔」のみを求めるプログラムだとしたら、 使うべきは TimeSpan であって、無理に DateTime 型を使う必要は 無いかと思います。
まぁ、とりあえずは、TimeSerial 関数を使うのが楽かもしれません。 TimeSerial 関数なら、「24時0分」や「23時60分」といった 通常の時刻の範囲外の値も受け付けますから。
24時以降の日付は翌日以降の日時として返されますが、 「今日の24時」と「明日の0時」は同じ時刻ですので、 今回の目的である『経過時間』の算出には支障無いでしょう。
> どうやら、24:00というのが日付型として認識されないようなので、 そもそも、VB の Date型(System.DateTime構造体)というのは、 「日付と時刻」を扱うための型です。 時刻部だけを保持することは出来ず、日付部の情報を必ず伴います。
もしも DateTime 型の値を、「日付部だけ」「時刻部だけ」で扱う必要がある場合は、 dt.Date …… 日付部のみを返す。(時刻部が0時0分ジャストな DateTime 型) dt.TimeOfDay …… 時刻部のみを返す。(日数部が0日な TimeSpan型) を併用することもできます。
いずれにせよ、Date型(DateTime型)で時刻を扱う場合には、 それが「何月何日時点の時刻情報なのか」を意識せねばなりません。
たとえば、 dt = DateTime.Parse("23:59") とした場合、「『本日』の23時59分0秒ジャスト」を意味します。
つまり上記の処理は、実行した日付によって、結果が異なってしまうわけです。 深夜帯に、日またぎでこのプログラムを実行する場合は要注意ですね。
> 00:00と入力された場合は23:59として 「何日の23時59分なのか」を意識して処理してみてください。 1月1日の24時は、1月2日の0時ですよね。
下記はすべて、「『西暦1年1月2日』の0時0分0秒ジャスト」を意味します。 dt2 = #00:00#.AddDays(1.0) dt2 = #23:59#.AddMinutes(1.0) dt2 = TimeSerial(24, 0, 0)
2 つの日付型の差を求める場合、 Dim span As TimeSpan = dt2 - dt1 で算出できます。dt2.Subtract(dt1) でも良いですが。
この後は、TimeSpan 型のプロパティを使っていけば OK です。 span.TotalDays span.TotalHours span.TotalMinutes
span.Days span.Hours span.Minutes などですね。何分経過したのかを見るなら、TotalMinutes です。
|