C#:様々な型を DateTime 型に変換する方法

C#:様々な型を DateTime 型に変換する方法

C# で日付や時刻を扱う基本的な型である DateTime。多くの場合、文字列や数値など、他の型のデータとして日付や時刻の情報を受け取ることがあります。この記事では、C# で様々な型を DateTime 型に変換する一般的な方法を解説します。

1. 文字列 (string) から DateTime へ

最も一般的なケースは、文字列として表現された日付や時刻を DateTime 型に変換することでしょう。これには DateTime.Parse()DateTime.TryParse()、そして DateTime.ParseExact() などのメソッドを使用します。

DateTime.Parse()

DateTime.Parse() メソッドは、指定された文字列を DateTime 型に変換します。文字列が認識可能な形式でない場合は FormatException がスローされます。


string dateString1 = "2025/04/15";
DateTime dateTime1 = DateTime.Parse(dateString1);
Console.WriteLine(dateTime1); // 出力: 2025/04/15 0:00:00

string dateTimeString2 = "2025-04-15 09:30:00";
DateTime dateTime2 = DateTime.Parse(dateTimeString2);
Console.WriteLine(dateTime2); // 出力: 2025/04/15 9:30:00

DateTime.TryParse()

DateTime.TryParse() メソッドは、DateTime.Parse() と同様の変換を試みますが、変換に失敗した場合でも例外をスローしません。代わりに、変換の成功/失敗を示す bool 値を返し、成功した場合は out パラメータで DateTime 型の値を返します。


string invalidDateString = "2025-04-XX";
DateTime parsedDateTime;

if (DateTime.TryParse(invalidDateString, out parsedDateTime))
{
    Console.WriteLine($"変換成功: {parsedDateTime}");
}
else
{
    Console.WriteLine($"変換失敗: {invalidDateString} は DateTime 形式ではありません。");
}

DateTime.ParseExact()

DateTime.ParseExact() メソッドは、指定された文字列が、指定された正確な形式と一致する場合にのみ DateTime 型に変換します。形式が一致しない場合は FormatException がスローされます。


string specificFormatString = "15/04/2025";
string format = "dd/MM/yyyy";
DateTime exactDateTime = DateTime.ParseExact(specificFormatString, format, null);
Console.WriteLine(exactDateTime); // 出力: 2025/04/15 0:00:00

string wrongFormatString = "2025-04-15";
try
{
    DateTime wrongDateTime = DateTime.ParseExact(wrongFormatString, format, null);
}
catch (FormatException ex)
{
    Console.WriteLine($"変換失敗: {wrongFormatString} は {format} 形式ではありません。");
}

複数の許容される形式がある場合は、ParseExact()オーバーロードを使用できます。


string ambiguousDateString = "20250415";
string[] formats = { "yyyyMMdd", "yyyy-MM-dd" };
DateTime multiFormatDateTime = DateTime.ParseExact(ambiguousDateString, formats, null, DateTimeStyles.None);
Console.WriteLine(multiFormatDateTime); // 出力: 2025/04/15 0:00:00

2. 数値型 (int, long) から DateTime へ

数値型で日付や時刻の情報が表現されている場合、通常は特定の基準点からの経過時間(例:Unix エポックからの秒数、ティック数)として扱われます。DateTimeOffset 構造体を使用すると、このような数値を DateTime (または DateTimeOffset) に変換できます。

Unix エポックからの秒数 (long)

Unix エポック(1970年1月1日午前0時 UTC)からの経過秒数を DateTime に変換する例です。


long unixEpochSeconds = 1681515600; // 2023年4月15日 9:00:00 UTC

DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(unixEpochSeconds);
DateTime dateTimeFromUnix = dateTimeOffset.UtcDateTime.ToLocalTime(); // 必要に応じてローカル時間に変換
Console.WriteLine(dateTimeFromUnix);

.NET ティック数 (long)

.NET の DateTime は、西暦 0001 年 1 月 1 日午前 0 時からの 100 ナノ秒間隔のティック数で内部的に時間を表現しています。


long dotNetTicks = 638486832000000000; // 2025年4月15日 12:00:00 (ローカル時間) のティック数

DateTime dateTimeFromTicks = new DateTime(dotNetTicks, DateTimeKind.Local);
Console.WriteLine(dateTimeFromTicks);

注意: 数値から DateTime に変換する場合、その数値がどのような基準で時間を表しているのかを正確に理解することが非常に重要です。

3. その他の型からの変換

他のカスタム型やオブジェクトから DateTime を取得する場合は、そのオブジェクトが DateTime 型のプロパティを持っているか、または DateTime 型に変換するためのメソッドを提供している可能性があります。

例えば、データベースから取得したデータリーダー (DataReader) の特定のフィールドが DateTime 型として格納されている場合、直接 DateTime 型として読み取ることができます。

例 (ADO.NET を使用したデータベースからの読み取りを想定)


 using System.Data.SqlClient;

 string connectionString = "...";
 using (SqlConnection connection = new SqlConnection(connectionString))
 {
     connection.Open();
     string query = "SELECT DateColumn FROM YourTable WHERE Id = 1";
     using (SqlCommand command = new SqlCommand(query, connection))
     using (SqlDataReader reader = command.ExecuteReader())
     {
         if (reader.Read())
         {
             DateTime dateFromDatabase = reader.GetDateTime(0);
             Console.WriteLine($"データベースからの日付: {dateFromDatabase}");
         }
     }
 }

また、特定のライブラリやフレームワークが、独自の日付/時刻型を提供している場合もあります。その場合は、それぞれのライブラリが提供する変換メソッドやプロパティを利用して DateTime 型に変換する必要があります。

まとめ

C# で様々な型を DateTime 型に変換する方法は多岐にわたります。

  • 文字列から変換する場合: DateTime.Parse()DateTime.TryParse()DateTime.ParseExact() を使用し、必要に応じて例外処理や形式指定を行います。
  • 数値から変換する場合: DateTimeOffset.FromUnixTimeSeconds()new DateTime(ticks, DateTimeKind) を使用しますが、数値がどのような基準で時間を表しているかを正確に理解することが重要です。
  • その他の型から変換する場合: その型が提供するプロパティやメソッドを利用します。

状況に応じて適切な変換方法を選択し、安全かつ正確に DateTime 型のデータを扱えるようにしましょう。

関連記事

taglibrary.hatenablog.com