VB.NETの日付と時間処理を完全ガイド!失敗しないためのベストプラクティス
生徒
「先生、VB.NETで日付や時間を扱うプログラムを書いていますが、時々計算がズレたり、エラーが出たりして困っています。プロがやっている『正しいやり方』ってありますか?」
先生
「それは『ベストプラクティス』を知りたいということですね。日付の処理は、実はプログラミングの中でもミスが起きやすい場所なんです。」
生徒
「ベストプラクティス……なんだかカッコいい響きですね!具体的にどうすればいいんでしょうか?」
先生
「世界中で使われるアプリでも通用する、安全で正確な日付操作のコツを一つずつお教えしますね!」
1. ベストプラクティスとは?なぜ必要なのか
プログラミングにおけるベストプラクティスとは、多くのエンジニアが経験の中でたどり着いた「最も効率的で、ミスが少ない最高の方法」のことです。特に日付や時間の処理は、パソコンに詳しくない方が想像するよりもずっと複雑です。うるう年があったり、国によって時差があったり、サマータイムがあったりと、落とし穴がたくさんあるからです。
適当にコードを書いてしまうと、自分のパソコンでは正しく動いても、他の人のパソコンや海外で使った瞬間にバグ(不具合)が発生することがあります。VB.NETで日付を扱う際のルールを守ることで、誰がどこで見ても正しく、メンテナンスがしやすい「綺麗なプログラム」を書くことができるようになります。これは、プロのプログラマーへの大きな一歩です。
2. 日付の保存は「UTC」で行うのが世界のルール
最も重要なルールは、日付を保存したり計算したりする時は必ずUTC(協定世界時)を使うことです。UTCとは「世界共通の基準時間」のことです。日本の時間は、このUTCから9時間進んでいます。もし日本時間だけでプログラムを作ってしまうと、海外のユーザーがデータを見た時に時間がズレて表示されてしまいます。
表示する時だけ「日本時間」や「ニューヨーク時間」に直し、プログラムの内部やデータベースに保存する時は常に「世界基準」で持つ。これが、混乱を防ぐための鉄則です。
' 現在の時間を世界基準(UTC)で取得するのがプロの技
Dim worldStandardTime As DateTime = DateTime.UtcNow
' 保存する時はこの世界基準の時間を使いましょう
Console.WriteLine("世界基準の時間:" & worldStandardTime.ToString())
実行結果は以下のようになります。
世界基準の時間:2026/03/28 11:00:17
3. 文字列への変換は「形式」を必ず指定する
日付を画面に表示するために文字に変える際、単に ToString() とだけ書くのは避けましょう。これだと、パソコンの設定(日本語設定か英語設定かなど)によって、「2026/03/28」になったり「03-28-2026」になったりと、見た目が勝手に変わってしまうからです。
プログラムの中で日付を扱う際は、常に "yyyy/MM/dd" のように、自分が意図した形式をハッキリと指定するのがベストプラクティスです。これで、どのパソコンで動かしても同じ見た目を保つことができます。
Dim ima As DateTime = DateTime.Now
' yyyyは年、MMは月、ddは日を意味します
' 形式を固定することで、予期せぬ表示崩れを防げます
Dim styleDate As String = ima.ToString("yyyy年MM月dd日 HH時mm分")
Console.WriteLine("指定した形式:" & styleDate)
実行結果は以下のようになります。
指定した形式:2026年03月28日 20時00分
4. 日付の計算には専用の命令を使う
「明日」の日付を知りたい時、日付のデータに無理やり「1」を足すような計算をしてはいけません。日付は単純な数字ではないからです。31日の次に「1」を足して「32日」になってしまったら大変ですよね。
VB.NETには AddDays(アド・デイズ)や AddMonths(アド・マンス)といった、日付計算専用の命令が備わっています。これらを使えば、月末の処理やうるう年の計算もすべてパソコンが自動で正しく処理してくれます。自分で難しい計算式を作る必要はありません。
Dim kyo As DateTime = DateTime.Today
' 10日後を計算します
Dim future As DateTime = kyo.AddDays(10)
' 1ヶ月前を計算します(マイナスを指定すればOK)
Dim past As DateTime = kyo.AddMonths(-1)
Console.WriteLine("10日後:" & future.ToString("yyyy/MM/dd"))
Console.WriteLine("1ヶ月前:" & past.ToString("yyyy/MM/dd"))
実行結果は以下のようになります。
10日後:2026/04/07
1ヶ月前:2026/02/28
5. 存在しない日付のチェックを徹底する
ユーザーが入力した日付が正しいかどうかを確認することも欠かせません。「2月30日」や「13月1日」といった、現実には存在しない日付がプログラムに入り込むと、その後の処理でエラーが発生してしまいます。これを防ぐために、変換を試みる TryParse(トライ・パース)という機能を使うのが最も安全です。
これは「この文字は日付として正しいかな?」と優しく確認してくれる機能です。もし正しくなければ、エラーで止まるのではなく「正しくないですよ」という結果だけを返してくれます。
Dim input As String = "2026/02/30" ' ありえない日付
Dim resultDate As DateTime
' 日付として正しいかチェックします
If DateTime.TryParse(input, resultDate) Then
Console.WriteLine("正しい日付です。")
Else
Console.WriteLine("<i class="bi bi-x-octagon-fill"></i> エラー:存在しない日付が入力されました。")
End If
実行結果は以下のようになります。
エラー:存在しない日付が入力されました。
6. 期間の計算はTimeSpanを活用する
「イベントまであと何日?」や「作業に何時間かかった?」といった、二つの日時の間隔を調べたい時は TimeSpan(タイムスパン) という道具を使います。日付同士を引き算すると、自動的にこのTimeSpanという形になります。これを使うと、合計の「日数」や「時間」を簡単に取り出すことができます。
自分で「何時間は何秒で……」と計算するのは間違いの元です。パソコンが持っている「期間専用の型」を使うのが、賢いプログラミングの秘訣です。
Dim startDay As New DateTime(2026, 1, 1)
Dim goalDay As New DateTime(2026, 3, 28)
' 引き算すると「期間(TimeSpan)」が得られます
Dim duration As TimeSpan = goalDay - startDay
Console.WriteLine("経過した日数:" & duration.Days & "日")
実行結果は以下のようになります。
経過した日数:86日
7. DateTimeOffsetを使って「時差」も管理する
最近のプログラミングで特に推奨されているのが DateTimeOffset(デートタイム・オフセット)という道具です。これまでの DateTime よりも進化しており、「その時間が、世界基準(UTC)からどれだけズレているか」という情報をセットで持ち運べます。
「午後3時」と言っても、それが日本での話なのか、イギリスでの話なのかがハッキリ分かります。特に、インターネットを通じて世界中の人とやり取りするようなアプリを作る場合は、この DateTimeOffset を使うのが現代のベストプラクティスと言えるでしょう。
8. 誰にでも優しい日付表示を心がける
最後は技術的な話ではなく、使う人への思いやりです。プログラム内部ではどんなに完璧なベストプラクティスを守っていても、画面に表示されるのが「20260328200000」という数字の羅列だったら、使う人は困ってしまいます。読みやすいようにスラッシュをいれたり、曜日を表示したり、日本のユーザー向けなら和暦を添えたりすることも大切です。
プログラムの裏側は「世界基準で厳格に」、表側の表示は「使う人に合わせて親切に」。この二面性を使い分けることができるようになれば、あなたはもう立派な開発者です。日付と時間の処理は奥が深いですが、基本のルールを一つずつ守っていけば、必ず使いやすくて壊れないアプリが作れるようになりますよ!