連載
» 2005年02月25日 05時00分 UPDATE

.NET TIPS:日時や時間間隔の加減算を行うには?

[遠藤孝信,デジタルアドバンテージ]
「.NET TIPS」のインデックス

連載目次

 .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

DateTime構造体とTimeSpan構造体を利用したC#のサンプル・プログラム(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

DateTime構造体とTimeSpan構造体を利用したVB.NETのサンプル・プログラム(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」のインデックス

.NET TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。