.NET Frameworkのクラス・ライブラリには、時間を表す構造体が2種類ある。1つは特定の日時を表すDateTime構造体(System名前空間)、もう1つは時間間隔を表すTimeSpan構造体(System名前空間)だ。本稿では、これら2つの構造体における加減算について解説する。
日時(DateTime構造体)における加減算
2つのDateTimeオブジェクトは、両者を加算することはできないが、一方からもう一方を減算し、その時間間隔をTimeSpanオブジェクトとして求めることができる。これにはDateTime構造体のSubtractメソッドを使用するが、C#では、-演算子(マイナス演算子)がオーバーロードされているため、2つのオブジェクト同士の単純な引き算として記述できる(以下のサンプル・コードはすべてVB.NET)。
Dim startDateTime, endDateTime As DateTime
……
Dim interval AS TimeSpan = endDateTime.Subtract(startDateTime)
' C#では「endDateTime - startDateTime」と記述可
日付同士の加算はできないが、日付に時間間隔を加えて、別の日付を得ることは可能だ。
endDateTime = startDateTime.Add(interval)
' C#では「startDateTime + interval」と記述可
時間間隔(TimeSpan構造体)における加減算
TimeSpanオブジェクト同士は、加算および減算の両方が可能である。これにはAddメソッドおよびSubtractメソッドが用意されており、C#では演算子のオーバーロードにより、+演算子と-演算子が利用できる。もちろんその演算結果もTimeSpanオブジェクトとなる。
Dim total, diff, interval1, interval2 As TimeSpan
……
total = interval1.Add(interval2)
' C#では「interval1 + interval2」と記述可
diff = interval1.Subtract(interval2)
' C#では「interval1 - interval2」と記述可
diff = diff.Duration() ' 絶対値の取得
TimeSpanオブジェクトは負の値になり得るが、上記コードの最後の行に示したように、Durationメソッドによりその絶対値(正の値)を得ることができる。
DateTime構造体とTimeSpan構造体を利用したサンプル・プログラム
最後に、DateTime構造体とTimeSpan構造体を利用した簡単なサンプル・プログラムを示しておく。このプログラムは、2組の開始時刻と終了時刻からその時間間隔を求め、それらの合計時間を表示する。
// timespan.cs
using System;
public class DateTimeAndTimeSpan {
static void Main() {
DateTime start1, end1, start2, end2;
start1 = DateTime.Parse("2005/02/24 08:10");
end1 = DateTime.Parse("2005/02/24 20:30");
start2 = DateTime.Parse("2005/02/25 08:40");
end2 = DateTime.Parse("2005/02/25 22:55");
TimeSpan total, duration1, duration2;
duration1 = end1 - start1;
duration2 = end2 - start2;
total = duration1 + duration2;
Console.WriteLine("合計={0}時間", total.TotalHours);
// 出力:合計=26.5833333333333時間
Console.WriteLine("合計={0}時間{1}分",
(int)total.TotalHours,
duration1.Minutes);
// 出力:合計=26時間20分
}
}
// コンパイル方法:csc timespan.cs
timespan.csのダウンロード
' timespan.vb
Imports System
Imports Microsoft.VisualBasic
Public Class DateTimeAndTimeSpan
Shared Sub Main()
Dim start1, end1, start2, end2 As DateTime
start1 = DateTime.Parse("2005/02/24 08:10")
end1 = DateTime.Parse("2005/02/24 20:30")
start2 = DateTime.Parse("2005/02/25 08:40")
end2 = DateTime.Parse("2005/02/25 22:55")
Dim total, duration1, duration2 As TimeSpan
duration1 = end1.Subtract(start1)
duration2 = end2.Subtract(start2)
total = duration1.Add(duration2)
Console.WriteLine("合計={0}時間", total.TotalHours)
' 出力:合計=26.5833333333333時間
Console.WriteLine("合計={0}時間{1}分", _
Int(total.TotalHours), _
duration1.Minutes)
' 出力:合計=26時間20分
End Sub
End Class
' コンパイル方法:vbc timespan.vb
timespan.vbのダウンロード
TimeSpanオブジェクトの値を時間数として得たい場合にはTotalHoursプロパティが利用できるが、その値は端数(1時間未満の値)を小数として表すdouble型となる。上記プログラムの最後の行では、C#の場合にはTotalHoursプロパティの値をint型にキャストすることにより、VB.NETではInt関数(Microsoft.VisualBasic名前空間)により、小数点以下を切り捨てた時間数を取得し、さらに分の数をMinutesプロパティから取得して、合計時間を表示している。
TotalHoursプロパティとは別に、TimeSpan構造体にはHoursプロパティがあるが、このプロパティからはTimeSpanオブジェクトの値の時間部分(0〜23の整数)しか得られないので注意してほしい(例えばTotalHoursプロパティの値が「26」の場合には、Hoursプロパティの値は「2」となる)。
カテゴリ:クラス・ライブラリ 処理対象:日付と時刻
使用ライブラリ:DateTime構造体(System名前空間)
使用ライブラリ:TimeSpan構造体(System名前空間)
使用ライブラリ:Int関数(Microsoft.VisualBasic名前空間)
■この記事と関連性の高い別の.NET TIPS
Copyright© Digital Advantage Corp. All Rights Reserved.