Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

文字列が日時として妥当かどうかを返す拡張メソッドIsValidAsDateTime

文字列の変換は不要で、日時として妥当かどうかを知りたいだけの場合、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();
        }
    }
}

動作結果

f:id:JHashimoto:20160308223308p:plain