Parseメソッドでは、サポートされているすべての書式を使ってDateTime・DateTimeOffsetへの変換を試行し、変換できた場合はその結果を返します。 つまり、書式に関わらず日時と解釈できるものはすべて変換します。 一方、変換しようとする日時の書式があらかじめ定まっている場合など、目的の書式と完全に一致するものだけを変換し、それ以外の書式のものは不正な値として扱いたい場合があります。 そういった場合にはParseExactメソッドを使うことができます。

ParseExactメソッドでは、一つ以上の書式を指定し、文字列がその書式と完全に一致した場合はその値を変換した結果を返します。 指定されたどの書式とも一致しない場合は例外FormatExceptionをスローします。

次の例では、書式としてo(ISO8601形式)を指定し、日時を表すいくつかの文字列の変換を行った結果を表示しています。

DateTime/DateTimeOffset.ParseExactメソッドで指定された書式に一致する文字列のみを変換する
using System;

class Sample {
  static void Main()
  {
    var inputs = new string[] {
      "Mon, 01 Apr 2013 15:00:30 GMT",     // RFC1123形式の文字列
      "2013年4月1日 15:00:30",             // 一般的な形式の文字列
      "2013-04-01T15:00:30.1230000+09:00", // ISO8601形式の文字列
      "2013-04-01T15:00:30.1230000",       // ISO8601形式の文字列 (オフセット無し)
      "2013-04-01",                        // ISO8601形式の文字列 (日付のみ)
      "15:00:30",                          // ISO8601形式の文字列 (時刻のみ)
    };

    foreach (var input in inputs) {
      try {
        // 書式"o"で文字列をDateTimeに変換
        Console.WriteLine("{0,-35} -> {1}", input, DateTime.ParseExact(input, "o", null));
      }
      catch (FormatException) {
        // 書式と一致しない場合はFormatExceptionとなる
        Console.WriteLine("{0,-35} -> FormatException", input);
      }
    }
    Console.WriteLine();

    foreach (var input in inputs) {
      try {
        // 書式"o"で文字列をDateTimeOffsetに変換
        Console.WriteLine("{0,-35} -> {1}", input, DateTimeOffset.ParseExact(input, "o", null));
      }
      catch (FormatException) {
        Console.WriteLine("{0,-35} -> FormatException", input);
      }
    }
    Console.WriteLine();
  }
}
実行結果
Mon, 01 Apr 2013 15:00:30 GMT       -> FormatException
2013年4月1日 15:00:30                  -> FormatException
2013-04-01T15:00:30.1230000+09:00   -> 2013/04/01 15:00:30
2013-04-01T15:00:30.1230000         -> 2013/04/01 15:00:30
2013-04-01                          -> FormatException
15:00:30                            -> FormatException

Mon, 01 Apr 2013 15:00:30 GMT       -> FormatException
2013年4月1日 15:00:30                  -> FormatException
2013-04-01T15:00:30.1230000+09:00   -> 2013/04/01 15:00:30 +09:00
2013-04-01T15:00:30.1230000         -> 2013/04/01 15:00:30 +09:00
2013-04-01                          -> FormatException
15:00:30                            -> FormatException

文字列化の場合と同様に、書式には標準およびカスタム書式指定子を指定することができます。 上記の結果からも分かるとおり、書式と完全に一致する場合のみ変換が行われるため、日付と時刻両方の形式が定義されている標準書式指定子の場合は、日付のみ・時刻のみなど一部が一致していても不正な文字列として扱われ、変換は失敗します。 日付のみ・時刻のみを変換したい場合はParseメソッドを使用するか、日付のみ・時刻のみが含まれる書式指定子(標準またはカスタム)を指定する必要があります。

ParseExactメソッドもParseメソッドと同様に書式プロバイダを指定することができます。 ただし、ParseExactメソッドには書式プロバイダを省略できるバージョンのオーバーロードが用意されていないので、常に何らかのIFormatProviderを指定する必要があります。 上記の例では、省略する代わりにnull/Nothingを指定しています。