VB.NETで日時の差を計算する方法を完全ガイド!TimeSpanを使いこなそう
生徒
「先生、プログラミングで『イベントまであと何日?』とか『作業に何時間かかった?』というのを計算する方法はありますか?」
先生
「もちろんです。VB.NETでは、二つの日付を引き算するだけで、その間の時間を簡単に計算できるんですよ。」
生徒
「引き算ですか?答えは日付になるんですか?それとも数字になるんですか?」
先生
「答えは『TimeSpan(タイムスパン)』という特別な形になります。これを使えば、日数や時間、分などを自由に取り出せます。基本的な使い方をマスターしましょう!」
1. 日時の差を計算する「TimeSpan」とは?
VB.NETで日付と日付の引き算をしたときに得られる結果を TimeSpan(タイムスパン) と呼びます。パソコン初心者の方向けに簡単に説明すると、日付(DateTime)が「カレンダー上の特定の点」を指すのに対し、タイムスパンは「時間の長さ(期間)」を指します。
例えば、「2026年1月1日」と「2026年1月5日」は点ですが、その差である「4日間」という長さがタイムスパンです。プログラミングでは、この「長さ」を扱う専用の道具箱(型)を使うことで、「合計で何時間あるか」や「端数を除いた日数」などを正確に、かつ簡単に取り出すことができるようになります。
2. 二つの日付を引き算してみよう
まずは一番シンプルな方法を見ていきましょう。VB.NETでは、二つの DateTime(日付型の変数)を用意して、それらを普通の算数のように -(マイナス)記号で引くだけで、日時の差を求めることができます。
ここで言う「変数(へんすう)」とは、データを一時的に入れておくための「箱」のことです。日付を入れる箱同士を引き算すると、自動的に「時間の長さを入れる箱(TimeSpan型の変数)」に結果が収まります。これだけで、面倒なうるう年の計算や、月をまたぐ計算もパソコンがすべて肩代わりしてくれます。
' 開始日と終了日の箱を用意します
Dim kaishi As New DateTime(2026, 3, 1)
Dim shuryo As New DateTime(2026, 3, 26)
' 引き算をして「時間の長さ(TimeSpan)」を求めます
Dim sa As TimeSpan = shuryo - kaishi
' 何日間の差があるか表示します
Console.WriteLine("日数の差は: " & sa.Days & " 日です")
日数の差は: 25 日です
3. DaysプロパティとTotalDaysプロパティの違い
TimeSpanを使い始めると、必ずと言っていいほど「Days」と「TotalDays」という二つの似たような言葉に出会います。この違いを理解することが、初心者を脱出する第一歩です。
Days は、全体の中から「日の部分だけ」を取り出します。例えば「1日と12時間」という長さがあった場合、Daysは「1」になります。対して TotalDays は、全体を日単位で計算した合計値を教えてくれます。同じ例なら、TotalDaysは「1.5」になります。自分が知りたいのは「端数を切り捨てた日数」なのか「小数点まで含めた合計日数」なのかによって使い分けるのがポイントです。これは時間(Hours)や分(Minutes)でも同様です。
Dim jikan1 As New DateTime(2026, 3, 26, 10, 0, 0)
Dim jikan2 As New DateTime(2026, 3, 27, 22, 0, 0)
Dim kikan As TimeSpan = jikan2 - jikan1
' Days は「日」の部分だけ(1日)
Console.WriteLine("Days: " & kikan.Days)
' TotalDays は「全部で何日分か」(1.5日)
Console.WriteLine("TotalDays: " & kikan.TotalDays)
Days: 1
TotalDays: 1.5
4. 今この瞬間から特定の日までをカウントダウンする
応用例として、今の時間(現在日時)から将来の予定までの差を計算してみましょう。例えば、大切な記念日や締め切りまで「あと何分あるか」を計算するプログラムです。
現在の日時は DateTime.Now で取得できます。ここから将来の日付を引くと、マイナスの値になってしまうことがあるので、通常は「将来の日付 - 現在の日付」という順番で引き算をします。これにより、リアルタイムで時間が減っていくカウントダウンタイマーのような機能を実装する基礎が身につきます。
' 今の時間を取得
Dim ima As DateTime = DateTime.Now
' ターゲットの時間(今日の夜20時)を設定
Dim target As New DateTime(2026, 3, 26, 20, 0, 0)
' 差を計算
Dim nokori As TimeSpan = target - ima
' あと何時間何分かを表示
Console.WriteLine("あと " & nokori.Hours & " 時間 " & nokori.Minutes & " 分です")
あと 18 時間 40 分です
5. 時間の差を「分」や「秒」の合計で取得する
日数の計算だけでなく、「全部で何秒かかったか」という細かい計算をしたい場合も TotalSeconds などのプロパティを使えば一発です。これは、プログラムの処理速度を測ったり、テストの残り時間を秒単位で表示したりするときに非常に役立ちます。
パソコンを触ったことがない方にとって、1時間は3600秒といった計算は頭が痛くなるものですが、TimeSpanを使えば人間が計算する必要は一切ありません。どんなに長い期間であっても、パソコンが正確に秒数や分数を割り出してくれます。このような「合計値」の取得は、データの統計をとる際にもよく使われます。
Dim startJikan As DateTime = DateTime.Now
' (ここで何かの作業が行われたと想定)
Dim endJikan As DateTime = startJikan.AddMinutes(125)
Dim k経過 As TimeSpan = endJikan - startJikan
' 合計で何分かかったか
Console.WriteLine("合計分数: " & k経過.TotalMinutes & " 分")
' 合計で何秒かかったか
Console.WriteLine("合計秒数: " & k経過.TotalSeconds & " 秒")
合計分数: 125 分
合計秒数: 7500 秒
6. 日時差計算における注意点(過去と未来)
日付の引き算をするときに一つだけ注意点があります。それは「引き算の順番」です。古い日付から新しい日付を引くと、結果の TimeSpan はマイナスの値になります。例えば Days プロパティが -5 になったりします。
もし、常にプラスの数字(純粋な距離としての時間)が欲しい場合は、計算結果に対して .Duration() という命令を使うか、引き算の順番を間違えないようにしましょう。プログラムが予期せぬ動きをしたときは、このプラス・マイナスの符号をチェックしてみるのが解決の近道です。初心者の方は、まずは「新しい日付 - 古い日付」という形を基本として覚えておきましょう。
7. 便利なTimeSpanでアプリをより実用的に
日時の差を計算できるようになると、一気にアプリの「実用性」が高まります。ユーザーが入力した誕生日に基づいて「生まれてから今日で何日目か」を表示したり、ログインしている時間を計測して「長時間の利用にご注意ください」というメッセージを出したりすることも可能です。
VB.NETの TimeSpan は、今回紹介した以外にも多くの機能を持っていますが、まずは「引き算で長さが出る」「Totalプロパティで合計が出る」という二点を押さえるだけで十分です。プログラミングは、こうした便利な道具の使い方を少しずつ増やしていくパズルのようなものです。ぜひ、自分の身の回りにある「時間の差」を計算するプログラムを書いて、その便利さを体験してみてくださいね!