文字列からDateTimeへの変換
ユーザー入力、APIレスポンス、ファイルからの読み込みなど、C#プログラムがstring(文字列)型で日付や時刻(例: "2025/11/20")を受け取るケースは非常に多いです。これらの文字列をDateTimeオブジェクトとして扱えなければ、日付の計算や比較、並べ替えは行えません。
この変換にはDateTime.Parseメソッドがありますが、もし文字列が予期しない形式(例: "invalid-date"や空文字列)であった場合、FormatExceptionという実行時エラーが発生し、プログラムが停止してしまいます。
この問題を回避し、安全に文字列からDateTimeへの変換を試みるのが DateTime.TryParse メソッドです。
DateTime.TryParse メソッドの基本
TryParseは、DateTimeへの変換を「試行(Try)」します。
- 変換に成功した場合:
trueを返し、out引数で指定したDateTime変数に変換後の値を格納します。 - 変換に失敗した場合: 例外をスローせずに
falseを返し、out引数の変数にはDateTimeのデフォルト値(0001/01/01 0:00:00)が格納されます。
この動作により、if文と組み合わせて安全な変換処理を記述できます。
コード例1:標準的な日付・日時文字列
TryParseは、実行環境のカルチャ(地域設定)に基づき、標準的とみなされる形式("yyyy/MM/dd"、"MM/dd/yyyy"、ISO 8601形式の"yyyy-MM-dd"など)を自動的に解釈しようとします。
using System;
public class TryParseBasicExample
{
public static void Main()
{
// 1. 成功する日付形式
string dateString1 = "2025-11-20";
if (DateTime.TryParse(dateString1, out DateTime parsedDate1))
{
Console.WriteLine($"成功 (1): {parsedDate1:yyyy年MM月dd日}");
}
// 2. 成功する日時形式
string dateString2 = "2025/11/20 16:30:00";
if (DateTime.TryParse(dateString2, out DateTime parsedDate2))
{
Console.WriteLine($"成功 (2): {parsedDate2:g}"); // 短い日時形式
}
// 3. 失敗する形式 (例外は発生しない)
string invalidString = "Not a valid date";
if (DateTime.TryParse(invalidString, out DateTime parsedDate3))
{
Console.WriteLine($"成功 (3): {parsedDate3}");
}
else
{
// 変換に失敗するため、このブロックが実行される
Console.WriteLine($"失敗 (3): '{invalidString}' は日付として認識できません。");
}
}
}
出力結果:
成功 (1): 2025年11月20日
成功 (2): 2025/11/20 16:30
失敗 (3): 'Not a valid date' は日付として認識できません。
応用:特定のカルチャ(地域設定)での変換
TryParseのデフォルト動作は、OSの現在のカルチャに依存します。しかし、扱う文字列が特定のカルチャ(例えば「和暦」)であることがわかっている場合、そのカルチャ情報を明示的に指定する必要があります。
TryParse(string s, IFormatProvider provider, DateTimeStyles styles, out DateTime result) というオーバーロード(引数が異なる同名メソッド)を使用します。
コード例2:和暦(日本語カルチャ)の変換
"令和五年十一月二十日"のような和暦文字列は、ja-JP(日本語-日本)のカルチャ情報を指定することで正しくDateTimeに変換できます。
using System;
using System.Globalization; // CultureInfo を使用するために必要
public class TryParseCultureExample
{
public static void Main()
{
string japaneseDateString = "令和六年十一月二十日";
// 1. デフォルト (カルチャ指定なし) での試行
if (DateTime.TryParse(japaneseDateString, out DateTime parsedDate1))
{
Console.WriteLine($"デフォルトで成功: {parsedDate1:d}");
}
else
{
Console.WriteLine($"デフォルトでは '{japaneseDateString}' を認識できません。");
}
// 2. ja-JP カルチャを指定
CultureInfo japanCulture = new CultureInfo("ja-JP");
DateTimeStyles style = DateTimeStyles.None;
if (DateTime.TryParse(japaneseDateString, japanCulture, style, out DateTime parsedDate2))
{
Console.WriteLine($"ja-JPカルチャで成功: {parsedDate2:d} ({parsedDate2:yyyy})");
}
else
{
Console.WriteLine("ja-JPカルチャでも認識できませんでした。");
}
}
}
出力結果(実行環境によって1.の結果は変わる可能性があります):
デフォルトでは '令和六年十一月二十日' を認識できません。
ja-JPカルチャで成功: 2024/11/20 (2024)
CultureInfo("ja-JP")を指定することで、"令和"という元号が正しく西暦2024年にマッピングされ、変換が成功していることがわかります。
まとめ
DateTime.TryParseは、文字列からDateTime型への変換を安全に行うための必須のメソッドです。
FormatException例外の発生を防ぎ、if文で変換の成否を安全に処理できます。yyyy/MM/ddやyyyy-MM-ddなどの標準的な形式を自動的に認識します。- 和暦(元号)や特定の国・地域の書式を扱う場合は、
CultureInfoを指定するTryParseのオーバーロードを使用する必要があります。
