文字列の変換は不要で、日時として妥当かどうかを知りたいだけの場合、DateTime.TryParseを使うのは、煩わしいですよね。
DateTime result; // わざわざ変数を宣言しなければならない。 bool isValid = DateTime.TryParse("2016/01/01", out result);
そこで、文字列が日時として妥当かどうかを返す拡張メソッドIsValidAsDateTimeを書いてみました。
ソースコード
StringExtensions.cs
using System; using System.Globalization; namespace Extensions { public static class StringExtensions { /// <summary> /// <see cref="System.DateTime"/>に変換できるかどうかを示す値を取得します。 /// </summary> /// <param name="self"><see cref="System.String"/>のインスタンス。</param> /// <returns><see cref="System.DateTime"/>に正常に変換できる場合はtrue。それ以外の場合はfalse。</returns> public static bool IsValidAsDateTime(this string self) { DateTime result; return DateTime.TryParse(self, out result); } /// <summary> /// <see cref="System.DateTime"/>に変換できるかどうかを示す値を取得します。 /// </summary> /// <param name="self"><see cref="System.String"/>のインスタンス。</param> /// <param name="provider">カルチャ固有の書式情報を提供するオブジェクト。 </param> /// <param name="styles"> /// 現在のタイムゾーンまたは現在の日付と関連させて、解析された日付をどのように解釈するかを /// 定義する列挙値のビットごとの組み合わせ。 通常指定する値は、Noneです。 /// </param> /// <returns><see cref="System.DateTime"/>に正常に変換できる場合はtrue。それ以外の場合はfalse。</returns> public static bool IsValidAsDateTime(this string self, IFormatProvider provider, DateTimeStyles styles) { DateTime result; return DateTime.TryParse(self, provider, styles, out result); } } }
Program.cs
using System; using System.Globalization; namespace Extensions { class Program { static void Main(string[] args) { { bool isValid = "2016/01/01".IsValidAsDateTime(); Console.WriteLine(isValid); } { bool isValid = "2016/01/01a".IsValidAsDateTime(); Console.WriteLine(isValid); } { bool isValid = " 平成28年 1月 1日 ".IsValidAsDateTime(new CultureInfo("ja-JP"), DateTimeStyles.AllowWhiteSpaces); Console.WriteLine(isValid); } { bool isValid = " 平成28年 1月 1日あ".IsValidAsDateTime(new CultureInfo("ja-JP"), DateTimeStyles.AllowWhiteSpaces); Console.WriteLine(isValid); } Console.ReadKey(); } } }
動作結果