日付処理

[C#] DateTime構造体を使って日付処理をする方法

今回は、C#のDateTime構造体を使って日付処理をする方法をご紹介します。

C#のDateTime構造体とは

C#のDateTime構造体は、日付や時刻を管理するために用意された強力な仕組みです。

内部では1ティック(100ナノ秒単位)で管理されており、加算や減算などの演算や比較、文字列との相互変換など、さまざまな操作に対応しています。

また、DateTimeのインスタンスはイミュータブル(変更不可)のため、演算メソッドを呼び出すと新たなDateTimeオブジェクトを生成することを覚えておくと便利です。

DateTimeの基本的な使い方

ここではDateTimeを使う上で基本となる、日時の生成方法や取得方法、演算などを順に見ていきます。

日時の生成

最もよく使う方法は、DateTime.NowDateTime.Todayで現在時刻や本日の日付を取得するものです。

実行結果

2025/02/25 14:30:00

また、任意の日時を作成するときには、年・月・日だけ、あるいは時・分・秒まで指定できます。

実行結果

2025/02/25 0:00:00
2025/02/25 14:30:00

日付・時刻の取得

生成したDateTimeインスタンスのYearMonthなどのプロパティから、年月日や時分秒を取り出せます。

実行結果

年: 2025 月: 2 日: 25
時: 14 分: 30 秒: 0

日付の演算

日付を加算・減算するには、AddDaysAddHoursAddMonthsといったメソッドを使用します。

実行結果

2025/02/26 14:30:00
2025/02/25 15:30:00
2025/03/25 14:30:00

日付同士の差分を求めるときは、TimeSpanが返ります。

実行結果

差分(日数): 5.60416666666667

日付の比較

比較演算子(<>==など)や、DateTime.Compareメソッドで比較が可能です。

実行結果

date1はdate2より前の日付です。
date1はdate2より前です。

フォーマットとパース

DateTimeを文字列に変換するときは、ToStringメソッドを使って標準書式やカスタム書式を指定できます。

実行結果

2025/02/25 14:30:00
2025/02/25 14:30:00

文字列からDateTimeへ変換するには、ParseTryParseを利用します。

実行結果

2025-02-25 14:30:00
変換成功: 2025-02-25 14:30:00

DateTimeKindとタイムゾーン

DateTimeにはKindプロパティがあり、LocalUtcUnspecifiedのいずれを示すかを確認できます。

実行結果

Kind = Local, 値 = 2025/02/25 14:30:00
Kind = Utc, 値 = 2025/02/25 05:30:00
Kind = Unspecified, 値 = 2025/02/25 14:30:00
UTC -> Local = 2025/02/25 14:30:00
Local -> UTC = 2025/02/25 05:30:00

実用的な具体例

ここでは少し実践的なサンプルコードを挙げます。

例えば、ユーザーから入力された文字列をDateTimeに変換し、日付計算を行って結果を表示するといったユースケースが考えられます。

実行結果

元の日付: 2025/02/25 09:00:00
1日後: 2025/02/26 09:00:00
1時間前: 2025/02/25 08:00:00

注意点

DateTimeを使ううえで気をつけたい点もいくつかあります。

  • イミュータブルな性質を理解する
  • DateTimeKindの扱い
  • カルチャ(文化圏)の違いに応じたパース
  • 月末やうるう年などの特殊ケース
  • 国際的なシステムではDateTimeOffsetが推奨されることもある

これらを意識するだけで、思わぬ不具合を防ぎながら正しく日時を管理しやすくなります。

まとめ

C#のDateTime構造体を理解すると、日付と時刻に関する操作を柔軟に扱うことができます。

イミュータブル性やDateTimeKindなどの仕組みをうまく活用すると、安全かつ正確に日時を管理できます。

うるう年やタイムゾーンなどの特殊ケースへの注意も欠かせません。