プログラマーな日々

プログラマーをやっています。好きなツール:WorkFlowy、好きな言語:C#、好きなサービス:Backlog、好きなAWS:AWS Lambda。

【.NET】文字列が指定された書式の日時として妥当かどうかを返す拡張メソッドIsValidAsDateTimeExact

前回は、文字列が日時として妥当かどうかを返す拡張メソッドを作成しました。
blog.jhashimoto.net

そこで、今回は、文字列が指定された書式の日時として妥当かどうかを返す拡張メソッドIsValidAsDateTimeExactを作成してみます。

ソースコード

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>
        /// <param name="format">書式。</param>
        /// <param name="provider">カルチャ固有の書式情報を提供するオブジェクト。 </param>
        /// <param name="styles">
        /// 現在のタイムゾーンまたは現在の日付と関連させて、解析された日付をどのように解釈するかを
        /// 定義する列挙値のビットごとの組み合わせ。 通常指定する値は、Noneです。
        /// </param>
        /// <returns><see cref="System.DateTime"/>に正常に変換できる場合はtrue。それ以外の場合はfalse。</returns>
        public static bool IsValidAsDateTimeExact(this string self, string format, IFormatProvider provider, DateTimeStyles styles) {
            DateTime result;
            return DateTime.TryParseExact(self, format, provider, styles, out result);
        }

        /// <summary>
        /// 指定した書式の配列、カルチャ固有の書式情報、およびスタイルを使用して、<see cref="System.DateTime"/>
        /// 変換できるかどうかを示す値を取得します。文字列形式の書式は、指定した書式と完全に一致する必要があります。
        /// </summary>
        /// <param name="self"><see cref="System.String"/>のインスタンス。</param>
        /// <param name="formats">書式の配列。</param>
        /// <param name="provider">カルチャ固有の書式情報を提供するオブジェクト。 </param>
        /// <param name="styles">
        /// 現在のタイムゾーンまたは現在の日付と関連させて、解析された日付をどのように解釈するかを
        /// 定義する列挙値のビットごとの組み合わせ。 通常指定する値は、Noneです。
        /// </param>
        /// <returns><see cref="System.DateTime"/>に正常に変換できる場合はtrue。それ以外の場合はfalse。</returns>
        public static bool IsValidAsDateTimeExact(this string self, string[] formats, IFormatProvider provider, DateTimeStyles styles) {
            DateTime result;
            return DateTime.TryParseExact(self, formats, provider, styles, out result);
        }
    }
}

Program.cs

using System;
using System.Globalization;

namespace Extensions {
    class Program {
        static void Main(string[] args) {
            {
                bool isValid = "20160101".IsValidAsDateTimeExact("yyyyMMdd", null, DateTimeStyles.None);
                Console.WriteLine(isValid);
            }

            {
                bool isValid = "2016/01/01".IsValidAsDateTimeExact("yyyyMMdd", null, DateTimeStyles.None);
                Console.WriteLine(isValid);
            }

            {
                bool isValid = "20160101".IsValidAsDateTimeExact(
                    new string[] { "yyyy/MM/dd", "yyyyMMdd" }, null, DateTimeStyles.None);

                Console.WriteLine(isValid);
            }

            {
                bool isValid = "2016011".IsValidAsDateTimeExact(
                    new string[] { "yyyy/MM/dd", "yyyyMMdd" }, null, DateTimeStyles.None);

                Console.WriteLine(isValid);
            }

            Console.ReadKey();
        }
    }
}

動作結果

f:id:JHashimoto:20160312192433p:plain