目次
日付や時間の「差」を計算する
C#で日付や時刻を扱う際、「イベントの開始時刻から終了時刻までの経過時間」や、「ある日から別の日付までの残り日数」など、2つのDateTime(日時)の「差(間隔)」を計算したい場面は非常に多くあります。
DateTime構造体は、int型などの数値型と同じように、引き算演算子(-)をサポートしています。
DateTime の引き算と TimeSpan
DateTimeオブジェクトからDateTimeオブジェクトを引き算すると、その結果はDateTime型ではなく、**System.TimeSpan**構造体のオブジェクトとして返されます。
**TimeSpan**は、「時間の(間隔)」や「期間」を表現するための専用の型です。TimeSpanは、日数、時間、分、秒、ミリ秒といった単位で、2つの日時の差を保持します。
DateTime (特定の時点) – DateTime (特定の時点) = TimeSpan (期間)
コード例1:日付の差(日数)を求める
まずは、時刻情報を含まない(午前0時)日付同士の差を計算する例です。
using System;
public class TimeSpanDateExample
{
public static void Main()
{
// プロジェクトの開始日と終了日
DateTime projectStart = new DateTime(2025, 4, 1);
DateTime projectEnd = new DateTime(2025, 7, 10);
// DateTime同士を引き算すると TimeSpan が返される
TimeSpan projectDuration = projectEnd - projectStart;
Console.WriteLine("--- プロジェクト期間 (日付のみ) ---");
Console.WriteLine($"プロジェクト開始: {projectStart:yyyy/MM/dd}");
Console.WriteLine($"プロジェクト終了: {projectEnd:yyyy/MM/dd}");
Console.WriteLine($"結果の型: {projectDuration.GetType().Name}"); // TimeSpan
// TimeSpan.Days プロパティで「日」の部分を取得
Console.WriteLine($"期間 (日数): {projectDuration.Days} 日");
}
}
出力結果:
--- プロジェクト期間 (日付のみ) ---
プロジェクト開始: 2025/04/01
プロジェクト終了: 2025/07/10
結果の型: TimeSpan
期間 (日数): 100 日
コード例2:日時の差(時間)を求める
次に、時刻情報(時・分・秒)を含むDateTimeオブジェクトの差を計算する例です。
using System;
public class TimeSpanTimeExample
{
public static void Main()
{
// イベント開始からの経過時間
DateTime eventStartTime = new DateTime(2025, 11, 20, 10, 30, 0);
DateTime currentTime = new DateTime(2025, 11, 20, 14, 45, 15);
// 14:45:15 - 10:30:00 = 4時間15分15秒
TimeSpan elapsedTime = currentTime - eventStartTime;
Console.WriteLine("--- イベント経過時間 (時刻を含む) ---");
Console.WriteLine($"イベント開始: {eventStartTime:g}");
Console.WriteLine($"現在時刻: {currentTime:g}");
// TimeSpan をそのまま出力
// 04:15:15 (4時間15分15秒)
Console.WriteLine($"経過時間 (TimeSpan): {elapsedTime}");
}
}
出力結果:
--- イベント経過時間 (時刻を含む) ---
イベント開始: 2025/11/20 10:30
現在時刻: 2025/11/20 14:45
経過時間 (TimeSpan): 04:15:15
TimeSpanプロパティの活用
TimeSpanオブジェクトは、計算結果の間隔をさまざまな単位で取得するための便利なプロパティを持っています。
Totalプロパティと、部分プロパティの違い
TimeSpanのプロパティには、TotalHours(合計時間)とHours(時間の「部分」)のように、名前が似ていて動作が異なるものがあるため注意が必要です。
Hours,Minutes,Seconds:TimeSpanを「日・時・分・秒」に分解したときの、その部分をint型で返します。(例: 1日と5時間の場合、Hoursは5)TotalHours,TotalMinutes,TotalSeconds:TimeSpanの期間全体を、指定した単位に換算した合計値をdouble型(小数点以下も含む)で返します。(例: 1日と5時間の場合、TotalHoursは29.0)
コード例3:TimeSpanプロパティの使い分け
using System;
public class TimeSpanPropertiesExample
{
public static void Main()
{
// 2日と12時間30分の差
DateTime startTime = new DateTime(2025, 1, 1, 10, 0, 0);
DateTime endTime = new DateTime(2025, 1, 3, 22, 30, 0);
TimeSpan duration = endTime - startTime;
// duration は 2.12:30:00 (2日と12時間30分)
Console.WriteLine($"TimeSpan: {duration}");
Console.WriteLine("--- 部分プロパティ ---");
Console.WriteLine($"Days: {duration.Days} (日)");
Console.WriteLine($"Hours: {duration.Hours} (時)");
Console.WriteLine($"Minutes: {duration.Minutes} (分)");
Console.WriteLine("\n--- Total (合計) プロパティ ---");
Console.WriteLine($"TotalDays: {duration.TotalDays:F2} (合計日数)");
Console.WriteLine($"TotalHours: {duration.TotalHours:F2} (合計時間)");
Console.WriteLine($"TotalMinutes: {duration.TotalMinutes:F0} (合計分数)");
}
}
出力結果:
TimeSpan: 2.12:30:00
--- 部分プロパティ ---
Days: 2 (日)
Hours: 12 (時)
Minutes: 30 (分)
--- Total (合計) プロパティ ---
TotalDays: 2.52 (合計日数)
TotalHours: 60.50 (合計時間)
TotalMinutes: 3630 (合計分数)
まとめ
- C#で
DateTime同士を引き算(-演算子)すると、その差(期間)を表すTimeSpanオブジェクトが返されます。 TimeSpanは、DaysやHoursといったプロパティで期間の各部分を取得できます。- 期間全体の合計を特定の単位(合計日数や合計時間)で知りたい場合は、
TotalDaysやTotalHoursといったTotal系のプロパティを使用します。
