【C#】TryParseExactとParseExactの使い方

すぐ忘れて何度も調べることになるのでメモ

DateTime.TryParseExact と DateTime.ParseExact の使い方です。

確認環境

  • VisualStudio2019
  • C# 9.0
    • すごい昔からあるからバージョン不問

DateTime.TryParseExact

具体的なフォーマットを指定する場合以下のように指定する

using System.Globalization;

bool isOK = 
    DateTime.TryParseExact("20220413123045", "yyyyMMddHH:mm:ss", 
        CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result);

if (isOK)
{
    // 変換できた時の処理
}
  • 上記引数は雑に以下認識でOK
    • CultureInfo.InvariantCulture = 言語形式に依存しない形式、
    • DateTimeStyles.None = 具体的に形式を指定する場合NoneでOK

具体的なフォーマットは "yyyyMMdd" の個所で指定する。逆に形式を "s"、"D"、"r"、"F" など言語によって表示が変わる形式を Parse する場合、カルチャーは対象言語を正しく指定して、DateTimeStyles は入力される可能性のある文字列に対して正しく設定すること(=多言語対応になると変換できないトラブルが無限に出るので可能な限り避けたい)

DateTime.ParseExact

ついでに書式が指定できる ParseExact の使い方も紹介します。

using System.Globalization;

DateTime dt = 
    DateTime.ParseExact("20220413123045", "yyyyMMddHH:mm:ss",
        CultureInfo.InvariantCulture, DateTimeStyles.None);

引数の指定と意味はほぼ同じ。ただし変換できない文字列が指定されると FormatException が発生して処理が中断される。絶対に変換できるときはこっちを使ったほうがいいが、変換できるかわからないときは使用しない。

// 失敗すると例外が発生する
System.FormatException: 'String 'XXXXX' was not recognized as a valid DateTime.'