今回は、C#のDateTime構造体を使って日付処理をする方法をご紹介します。
C#のDateTime構造体とは
C#のDateTime構造体は、日付や時刻を管理するために用意された強力な仕組みです。
内部では1ティック(100ナノ秒単位)で管理されており、加算や減算などの演算や比較、文字列との相互変換など、さまざまな操作に対応しています。
また、DateTimeのインスタンスはイミュータブル(変更不可)のため、演算メソッドを呼び出すと新たなDateTimeオブジェクトを生成することを覚えておくと便利です。
DateTimeの基本的な使い方
ここではDateTimeを使う上で基本となる、日時の生成方法や取得方法、演算などを順に見ていきます。
日時の生成
最もよく使う方法は、DateTime.NowやDateTime.Todayで現在時刻や本日の日付を取得するものです。
1 2 |
DateTime now = DateTime.Now; // 現在のローカル日時を取得 DateTime today = DateTime.Today; // 今日の日付(時刻は00:00:00) |
2025/02/25 14:30:00
また、任意の日時を作成するときには、年・月・日だけ、あるいは時・分・秒まで指定できます。
1 2 3 4 5 |
DateTime specificDate = new DateTime(2025, 2, 25); // 2025年2月25日 0時0分0秒 DateTime specificDateTime = new DateTime(2025, 2, 25, 14, 30, 0); // 2025年2月25日 14時30分0秒 |
2025/02/25 0:00:00
2025/02/25 14:30:00
日付・時刻の取得
生成したDateTimeインスタンスのYearやMonthなどのプロパティから、年月日や時分秒を取り出せます。
1 2 3 4 5 6 7 8 9 10 11 |
DateTime now = DateTime.Now; // 現在時刻を取得 int year = now.Year; int month = now.Month; int day = now.Day; int hour = now.Hour; int minute = now.Minute; int second = now.Second; Console.WriteLine($"年: {year} 月: {month} 日: {day}"); Console.WriteLine($"時: {hour} 分: {minute} 秒: {second}"); |
年: 2025 月: 2 日: 25
時: 14 分: 30 秒: 0
日付の演算
日付を加算・減算するには、AddDaysやAddHours、AddMonthsといったメソッドを使用します。
1 2 3 4 5 6 7 8 9 10 |
DateTime now = new DateTime(2025, 2, 25, 14, 30, 0); // 2025/02/25 14:30:00 という日時を基準にする DateTime tomorrow = now.AddDays(1); // 1日後 DateTime oneHourLater = now.AddHours(1); // 1時間後 DateTime nextMonth = now.AddMonths(1); // 1か月後 Console.WriteLine(tomorrow.ToString("yyyy/MM/dd HH:mm:ss")); Console.WriteLine(oneHourLater.ToString("yyyy/MM/dd HH:mm:ss")); Console.WriteLine(nextMonth.ToString("yyyy/MM/dd HH:mm:ss")); |
2025/02/26 14:30:00
2025/02/25 15:30:00
2025/03/25 14:30:00
日付同士の差分を求めるときは、TimeSpanが返ります。
1 2 3 4 5 6 |
DateTime now = new DateTime(2025, 2, 25, 14, 30, 0); DateTime pastDate = new DateTime(2025, 2, 20); TimeSpan difference = now - pastDate; // 2025/02/25 14:30:00 - 2025/02/20 00:00:00 Console.WriteLine($"差分(日数): {difference.TotalDays}"); |
差分(日数): 5.60416666666667
日付の比較
比較演算子(<、>、==など)や、DateTime.Compareメソッドで比較が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
DateTime date1 = new DateTime(2025, 2, 25); DateTime date2 = new DateTime(2025, 3, 1); if (date1 < date2) { Console.WriteLine("date1はdate2より前の日付です。"); } int compareResult = DateTime.Compare(date1, date2); if (compareResult < 0) { Console.WriteLine("date1はdate2より前です。"); } |
date1はdate2より前の日付です。
date1はdate2より前です。
フォーマットとパース
DateTimeを文字列に変換するときは、ToStringメソッドを使って標準書式やカスタム書式を指定できます。
1 2 3 4 5 6 7 8 9 10 |
DateTime now = new DateTime(2025, 2, 25, 14, 30, 0); // 標準書式 string standardFormat = now.ToString(); // カスタム書式 string customFormat = now.ToString("yyyy/MM/dd HH:mm:ss"); Console.WriteLine(standardFormat); Console.WriteLine(customFormat); |
2025/02/25 14:30:00
2025/02/25 14:30:00
文字列からDateTimeへ変換するには、ParseやTryParseを利用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
string dateStr = "2025/02/25 14:30:00"; DateTime parsedDate = DateTime.Parse(dateStr); Console.WriteLine(parsedDate.ToString("yyyy-MM-dd HH:mm:ss")); if (DateTime.TryParse(dateStr, out DateTime tryParsedDate)) { Console.WriteLine("変換成功: " + tryParsedDate.ToString("yyyy-MM-dd HH:mm:ss")); } else { Console.WriteLine("変換失敗"); } |
2025-02-25 14:30:00
変換成功: 2025-02-25 14:30:00
DateTimeKindとタイムゾーン
DateTimeにはKindプロパティがあり、Local、Utc、Unspecifiedのいずれを示すかを確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
DateTime localTime = DateTime.Now; // KindはLocal DateTime utcTime = DateTime.UtcNow; // KindはUtc // 明示的に指定 DateTime unspecifiedTime = new DateTime(2025, 2, 25, 14, 30, 0, DateTimeKind.Unspecified); // タイムゾーン変換 DateTime convertedLocal = utcTime.ToLocalTime(); DateTime convertedUtc = localTime.ToUniversalTime(); Console.WriteLine($"Kind = {localTime.Kind}, 値 = {localTime}"); Console.WriteLine($"Kind = {utcTime.Kind}, 値 = {utcTime}"); Console.WriteLine($"Kind = {unspecifiedTime.Kind}, 値 = {unspecifiedTime}"); Console.WriteLine($"UTC -> Local = {convertedLocal}"); Console.WriteLine($"Local -> UTC = {convertedUtc}"); |
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に変換し、日付計算を行って結果を表示するといったユースケースが考えられます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System; class Program { static void Main() { // 入力文字列 string dateInput = "2025/02/25 09:00:00"; // 文字列をDateTimeに変換 if (DateTime.TryParse(dateInput, out DateTime parsed)) { // 1日後 DateTime oneDayLater = parsed.AddDays(1); // 1時間前 DateTime oneHourBefore = parsed.AddHours(-1); Console.WriteLine("元の日付: " + parsed.ToString("yyyy/MM/dd HH:mm:ss")); Console.WriteLine("1日後: " + oneDayLater.ToString("yyyy/MM/dd HH:mm:ss")); Console.WriteLine("1時間前: " + oneHourBefore.ToString("yyyy/MM/dd HH:mm:ss")); } else { Console.WriteLine("無効な日付形式です。"); } } } |
元の日付: 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などの仕組みをうまく活用すると、安全かつ正確に日時を管理できます。
うるう年やタイムゾーンなどの特殊ケースへの注意も欠かせません。