Как проверить DateTime в C #? - PullRequest
       21

Как проверить DateTime в C #?

103 голосов
/ 16 декабря 2008

Я сомневаюсь, что я единственный, кто придумал это решение, но если у вас есть лучшее, пожалуйста, опубликуйте его здесь. Я просто хочу оставить этот вопрос здесь, чтобы я и другие могли найти его позже.

Мне нужно было указать, была ли введена правильная дата в текстовое поле, и это код, который я придумал. Я запускаю это, когда фокус покидает текстовое поле.

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

Ответы [ 11 ]

236 голосов
/ 16 декабря 2008
DateTime.TryParse

Я считаю, что это быстрее, и это означает, что вам не нужно использовать уродливые try / catch:)

* 1004 например *

DateTime temp;
if(DateTime.TryParse(startDateTextBox.Text, out temp))
{
  // Yay :)
}
else
{
  // Aww.. :(
}
56 голосов
/ 16 декабря 2008

Не используйте исключения для управления потоком. Используйте DateTime.TryParse и DateTime.TryParseExact . Лично я предпочитаю TryParseExact с определенным форматом, но я думаю, что бывают времена, когда TryParse лучше. Пример использования на основе вашего исходного кода:

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

Причины предпочтения такого подхода:

  • Более понятный код (он говорит, что он хочет сделать)
  • Лучше, чем ловить и глотать исключения
  • Это не ловит исключения неуместно - например, OutOfMemoryException, ThreadInterruptedException. (Ваш текущий код может быть исправлен, чтобы избежать этого, просто перехватывая соответствующее исключение, но использование TryParse все равно будет лучше.)
18 голосов
/ 02 июля 2012

Вот еще один вариант решения, которое возвращает true, если строка может быть преобразована в тип DateTime, и false в противном случае.

public static bool IsDateTime(string txtDate)
{
    DateTime tempDate;
    return DateTime.TryParse(txtDate, out tempDate);
}
4 голосов
/ 16 декабря 2008

Я бы использовал метод DateTime.TryParse (): http://msdn.microsoft.com/en-us/library/system.datetime.tryparse.aspx

3 голосов
/ 16 декабря 2008

Проблема с использованием 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 голосов
/ 16 декабря 2008

Как насчет использования TryParse ?

1 голос
/ 13 декабря 2013
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 голос
/ 05 июля 2013
    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

0 голосов
/ 26 февраля 2019

Все ответы довольно хороши, но если вы хотите использовать одну функцию, это может работать

private bool validateTime(string dateInString)
{
    DateTime temp;
    if (DateTime.TryParse(dateInString, out temp))
    {
       return true;
    }
    return false;
}
0 голосов
/ 14 сентября 2016
DateTime temp;
try
{
    temp = Convert.ToDateTime(date);
    date = temp.ToString("yyyy/MM/dd");
}
catch 
{
    MessageBox.Show("Sorry The date not valid", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop,MessageBoxDefaultButton.Button1,MessageBoxOptions .RightAlign);
    date = null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...