【C#】文字列をDateTimeに安全に変換するTryParseとカルチャ(和暦)の扱い

目次

文字列から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/ddyyyy-MM-ddなどの標準的な形式を自動的に認識します。
  • 和暦(元号)や特定の国・地域の書式を扱う場合は、CultureInfoを指定するTryParseのオーバーロードを使用する必要があります。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次