文字列からDateTime・DateTimeOffsetへの変換には、Parseメソッドの他にもTryParseメソッドを使うことができます。 このメソッドでは変換できない場合にFormatExceptionをスローする代わりに、単に変換できなかったことを表すfalseを返します。 、DateTime・DateTimeOffsetに変換できた場合はTryParseメソッドの第二引数であるoutパラメータに変換結果が代入され、戻り値としてtrueが返されます。

DateTime/DateTimeOffset.TryParseメソッドで文字列からの変換を試みる
using System;

class Sample {
  static void Main()
  {
    var inputs = new string[] {
      "29 Feb 2012",
      "31 Feb 2013",                        // 存在しない日付
      "27:00:00",                           // 時刻が最小(0:0:0)〜最大(23:59:59)の範囲外
      "2013-04-01T15:00:30.1230000+15:00",  // オフセットが最小・最大(±14:00)の範囲外
      "0123456",                            // 日時として判別できない文字列
    };

    foreach (var input in inputs) {
      DateTime dt;

      // 文字列からDateTimeへの変換を試みる
      if (DateTime.TryParse(input, out dt))
        Console.WriteLine("{0,-35} -> {1}", input, dt);
      else
        Console.WriteLine("{0,-35} -> (invalid format)", input);
    }
    Console.WriteLine();

    foreach (var input in inputs) {
      DateTimeOffset dto;

      // 文字列からDateTimeOffsetへの変換を試みる
      if (DateTimeOffset.TryParse(input, out dto))
        Console.WriteLine("{0,-35} -> {1}", input, dto);
      else
        Console.WriteLine("{0,-35} -> (invalid format)", input);
    }
    Console.WriteLine();
  }
}
実行結果
29 Feb 2012                         -> 2012/02/29 0:00:00
31 Feb 2013                         -> (invalid format)
27:00:00                            -> (invalid format)
2013-04-01T15:00:30.1230000+15:00   -> 2013/04/02 0:00:30
0123456                             -> (invalid format)

29 Feb 2012                         -> 2012/02/29 0:00:00 +09:00
31 Feb 2013                         -> (invalid format)
27:00:00                            -> (invalid format)
2013-04-01T15:00:30.1230000+15:00   -> (invalid format)
0123456                             -> (invalid format)