web-dev-qa-db-ja.com

C#でDateTimeを検証する方法は?

このソリューションを思いついたのは私だけではないでしょうが、もっと良いものがあれば、ここに投稿してください。私と他の人が後で検索できるように、この質問をここに残したいだけです。

有効な日付がテキストボックスに入力されたかどうかを確認する必要がありましたが、これが私が思いついたコードです。フォーカスがテキストボックスから離れたときにこれを起動します。

try
{
    DateTime.Parse(startDateTextBox.Text);
}
catch
{
    startDateTextBox.Text = DateTime.Today.ToShortDateString();
}
104
Matt
DateTime.TryParse

これは私が信じているより速く、それはあなたがいtry/catchを使用する必要がないことを意味します:)

例えば

DateTime temp;
if(DateTime.TryParse(startDateTextBox.Text, out temp))
{
  // Yay :)
}
else
{
  // Aww.. :(
}
237
qui

フロー制御に例外を使用しないでください。 DateTime.TryParse および DateTime.TryParseExact を使用します。個人的には特定の形式のTryParseExactを好みますが、TryParseの方が優れている場合があると思います。元のコードに基づく使用例:

DateTime value;
if (!DateTime.TryParse(startDateTextBox.Text, out value))
{
    startDateTextox.Text = DateTime.Today.ToShortDateString();
}

このアプローチを好む理由:

  • より明確なコード(実行したいことを伝えます)
  • 例外をキャッチして飲み込むよりも優れたパフォーマンス
  • これは、例外を不適切にキャッチしません。 OutOfMemoryException、ThreadInterruptedException。 (現在のコードは、関連する例外をキャッチするだけでこれを回避するように修正できますが、TryParseを使用する方がより適切です。)
56
Jon Skeet

文字列をDateTime型に変換できる場合はtrueを返し、そうでない場合はfalseを返すソリューションの別のバリエーションがあります。

public static bool IsDateTime(string txtDate)
{
    DateTime tempDate;
    return DateTime.TryParse(txtDate, out tempDate);
}
18
Brendan Conrad

DateTime.TryParse()メソッドを使用します。 http://msdn.Microsoft.com/en-us/library/system.datetime.tryparse.aspx

4
Alex Fort

TryParse の使用はどうですか?

3
shapr

DateTime.TryParseの使用に関する問題は、区切り文字なしで入力された日付の非常に一般的なデータ入力のユースケースをサポートしていないことです。 011508

これをサポートする方法の例を次に示します。 (これは私が構築しているフレームワークからのものなので、その署名は少し奇妙ですが、コアロジックは使用できるはずです):

    private static readonly Regex ShortDate = new Regex(@"^\d{6}$");
    private static readonly Regex LongDate = new Regex(@"^\d{8}$");

    public object Parse(object value, out string message)
    {
        msg = null;
        string s = value.ToString().Trim();
        if (s.Trim() == "")
        {
            return null;
        }
        else
        {
            if (ShortDate.Match(s).Success)
            {
                s = s.Substring(0, 2) + "/" + s.Substring(2, 2) + "/" + s.Substring(4, 2);
            }
            if (LongDate.Match(s).Success)
            {
                s = s.Substring(0, 2) + "/" + s.Substring(2, 2) + "/" + s.Substring(4, 4);
            }
            DateTime d = DateTime.MinValue;
            if (DateTime.TryParse(s, out d))
            {
                return d;
            }
            else
            {
                message = String.Format("\"{0}\" is not a valid date.", s);
                return null;
            }
        }

    }
3
Robert Rossney
    protected bool ValidateBirthday(String date)
    {
        DateTime Temp;

        if (DateTime.TryParse(date, out Temp) == true &&
      Temp.Hour == 0 &&
      Temp.Minute == 0 &&
      Temp.Second == 0 &&
      Temp.Millisecond == 0 &&
      Temp > DateTime.MinValue)
            return true;
        else
            return false;
    }

//入力文字列が短い日付形式であると仮定します。
例えば。 「2013/7/5」はtrueまたは
"2013/2/31"はfalseを返します。
http://forums.asp.net/t/1250332.aspx/1
// bool booleanValue = ValidateBirthday( "12:55"); falseを返します

private void btnEnter_Click(object sender, EventArgs e)
{
    maskedTextBox1.Mask = "00/00/0000";
    maskedTextBox1.ValidatingType = typeof(System.DateTime);
    //if (!IsValidDOB(maskedTextBox1.Text)) 
    if (!ValidateBirthday(maskedTextBox1.Text))
        MessageBox.Show(" Not Valid");
    else
        MessageBox.Show("Valid");
}
// check date format dd/mm/yyyy. but not if year < 1 or > 2013.
public static bool IsValidDOB(string dob)
{ 
    DateTime temp;
    if (DateTime.TryParse(dob, out temp))
        return (true);
    else 
        return (false);
}
// checks date format dd/mm/yyyy and year > 1900!.
protected bool ValidateBirthday(String date)
{
    DateTime Temp;
    if (DateTime.TryParse(date, out Temp) == true &&
        Temp.Year > 1900 &&
       // Temp.Hour == 0 && Temp.Minute == 0 &&
        //Temp.Second == 0 && Temp.Millisecond == 0 &&
        Temp > DateTime.MinValue)
        return (true);
    else
        return (false);
}
1
Julius

すべての回答は非常に優れていますが、単一の関数を使用する場合、これは機能する可能性があります。

private bool validateTime(string dateInString)
{
    DateTime temp;
    if (DateTime.TryParse(dateInString, out temp))
    {
       return true;
    }
    return false;
}
0
Sayed idrees

特定のDateTimeに対してCultureInfo形式を定義することもできます

public static bool IsDateTime(string tempDate)
{
    DateTime fromDateValue;
    var formats = new[] { "MM/dd/yyyy", "dd/MM/yyyy h:mm:ss", "MM/dd/yyyy hh:mm tt", "yyyy'-'MM'-'dd'T'HH':'mm':'ss" };
    return DateTime.TryParseExact(tempDate, formats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out fromDateValue);
}
0
Yanga