Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: MattОтветов: 10

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

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

try
{
    DateTime.Parse(startDateTextBox.Text);
}
catch
{
    startDateTextBox.Text = DateTime.Today.ToShortDateString();
}
  • ‹сарказм›судя по ответам, я думаю, что мне следует использовать TryParse‹/сарказм› Спасибо за отличные ответы, ребята. Я даже не думал о TryParse Matt 16.12.2008
  • Пример простого для Google вопроса, который, если бы кто-то задал его сегодня, был бы несправедливо закрыт из-за недостаточного исследования. live-love 28.06.2013
  • вот простой способ сделать это без использования каких-либо специальных функций: ‹stackoverflow.com/questions/14917203/› Zameer Ansari 11.09.2013
  • даже Parse использует TryParse referencesource.microsoft.com/#mscorlib/system/ глобализация/ Slai 01.02.2017
  • Работа с DateTimes всегда неприятна. Спасибо Gonzo345 11.04.2017

validationdatetime

Ответы

Ответ 1 · рейтинг 277 · Chris James

DateTime.TryParse

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

e.g

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

Ответ 2 · рейтинг 62 · Jon Skeet

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

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

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

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

Ответ 3 · рейтинг 24 · Brendan Conrad

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

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

Ответ 4 · рейтинг 4 · Alex Fort

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

Ответ 5 · рейтинг 3 · shapr

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

Ответ 6 · рейтинг 3 · Robert Rossney

Проблема с использованием 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;
            }
        }

    }

Ответ 7 · рейтинг 2 · AecorSoft

Один лайнер:

if (DateTime.TryParse(value, out _)) {//dostuff}

Ответ 8 · рейтинг 1 · Chung_TheWebDeveloper

    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" возвращает значение "истина",
"2013/2/31" возвращает значение "ложь".
http://forums.asp.net/t/1250332.aspx/1
//bool booleanValue = ValidateBirthday("12:55"); возвращает ложь

Ответ 9 · рейтинг 1 · Sayed Muhammad Idrees

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

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

Ответ 10 · Yanga

Вы также можете определить формат 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);
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы