Подтвердить что ты не робот

Проверьте, является ли строка допустимой датой, используя DateTime.TryParse

Я использую функцию DateTime.TryParse(), чтобы проверить, является ли конкретная строка допустимым дата-временем, не зависящим от каких-либо культур.
К моему удивлению, функция возвращает true для четных строк типа "1-1", "1/1".etc.

Как я могу решить эту проблему?

Update:

Означает ли это, если я хочу проверить, действительно ли определенная строка действительна datetime, мне нужен огромный массив форматов? Думаю, будут разные комбинации.
Даже есть много разделителей дат ('.', '/', '-' и т.д.) в зависимости от культуры, мне будет сложно определить массив форматов для проверки.
В принципе, я хочу проверить, содержит ли конкретная строка AT LEAST день (от 1 до 31 или от 01 до 31), месяц (от 1 до 12 или от 01 до 12) и год (yyyy или yy) в любом порядке, с любым разделителем дат, Каким будет решение?
Итак, если значение включает любые части времени, оно должно также возвращать значение true. Я не мог бы определить массив формата.

4b9b3361

Ответ 1

Если вы хотите, чтобы ваши даты соответствовали определенному формату или форматам, используйте DateTime.TryParseExact, в противном случае это поведение по умолчанию DateTime.TryParse

DateTime.TryParse

Этот метод пытается игнорировать непризнанные данные, если это возможно, и заполняет отсутствующий месяц, день и год информацию с текущим Дата. Если s содержит только дату и время, этот метод предполагает время - 12:00 полуночи. Если s содержит компонент даты с двухзначный год, он преобразуется в год в текущей культуре текущий календарь, основанный на значении Calendar.TwoDigitYearMax имущество. Любой главный, внутренний или конечный символ пробела в s игнорируется.

Если вы хотите подтвердить несколько форматов, перейдите в DateTime.TryParseExact Method (String, String [], IFormatProvider, DateTimeStyles, DateTime). Пример из той же ссылки:

string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", 
                   "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", 
                   "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", 
                   "M/d/yyyy h:mm", "M/d/yyyy h:mm", 
                   "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm"};
string[] dateStrings = {"5/1/2009 6:32 PM", "05/01/2009 6:32:05 PM", 
                        "5/1/2009 6:32:00", "05/01/2009 06:32", 
                        "05/01/2009 06:32:00 PM", "05/01/2009 06:32:00"}; 
DateTime dateValue;

foreach (string dateString in dateStrings)
{
   if (DateTime.TryParseExact(dateString, formats, 
                              new CultureInfo("en-US"), 
                              DateTimeStyles.None, 
                              out dateValue))
      Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
   else
      Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
}
// The example displays the following output: 
//       Converted '5/1/2009 6:32 PM' to 5/1/2009 6:32:00 PM. 
//       Converted '05/01/2009 6:32:05 PM' to 5/1/2009 6:32:05 PM. 
//       Converted '5/1/2009 6:32:00' to 5/1/2009 6:32:00 AM. 
//       Converted '05/01/2009 06:32' to 5/1/2009 6:32:00 AM. 
//       Converted '05/01/2009 06:32:00 PM' to 5/1/2009 6:32:00 PM. 
//       Converted '05/01/2009 06:32:00' to 5/1/2009 6:32:00 AM.

Ответ 2

Используйте DateTime.TryParseExact(), если вы хотите сопоставлять определенный формат даты

 string format = "ddd dd MMM h:mm tt yyyy";
DateTime dateTime;
if (DateTime.TryParseExact(dateString, format, CultureInfo.InvariantCulture,
    DateTimeStyles.None, out dateTime))
{
    Console.WriteLine(dateTime);
}
else
{
    Console.WriteLine("Not a date");
}

Ответ 3

[TestCase("11/08/1995", Result= true)]
[TestCase("1-1", Result = false)]
[TestCase("1/1", Result = false)]
public bool IsValidDateTimeTest(string dateTime)
{
    string[] formats = { "MM/dd/yyyy" };
    DateTime parsedDateTime;
    return DateTime.TryParseExact(dateTime, formats, new CultureInfo("en-US"),
                                   DateTimeStyles.None, out parsedDateTime);
}

Просто укажите форматы даты, которые вы хотите принять в массиве с именами форматов.

Ответ 4

Я решил проблему со следующим кодом:

protected bool CheckDate(String date)
{
    try
    {
        DateTime dt = DateTime.Parse(date);
        return true;
    }
    catch
    {
        return false;
    }
}

Ответ 5

В принципе, я хочу проверить, содержит ли конкретная строка AT LEAST день (с 1 по 31 или с 01 по 31), месяц (с 1 по 12 или с 01 по 12) и год (yyyy или yy) в любом порядке, с любым разделитель дат, каким будет решение? Итак, если значение включает любые части времени, оно должно также возвращать значение true. Я не мог бы определить массив формата.

Когда я был в подобной ситуации, вот что я сделал:

  • Соберите все форматы, которые моя система должна поддерживать.
  • Посмотрел, что является общим или может быть обобщено.
  • Научился создавать REGEX (это инвестиции времени первоначально, но окупается, как только вы создаете один или два по своему усмотрению). Также не пытайтесь создавать REGEX для всех форматов за один раз, следуйте инкрементному процессу.
  • Я создал REGEX для охвата как можно большего формата.
  • В нескольких случаях, чтобы не сделать REGEX дополнительным сложным, я рассмотрел его с помощью метода DateTime.Parse().
  • С комбинацией как Parse, так и REGEX я удалось проверить правильность ввода/как ожидалось.

Этот http://www.codeproject.com/Articles/13255/Validation-with-Regular-Expressions-Made-Simple был действительно полезен как для понимания, так и для проверки синтаксиса для каждого формата.

Мои 2 цента, если это помогает....

Ответ 6

Попробуйте использовать

DateTime.ParseExact(
    txtPaymentSummaryBeginDate.Text.Trim(),
    "MM/dd/yyyy", 
    System.Globalization.CultureInfo.InvariantCulture
);

Он выдает исключение, если строка ввода не находится в правильном формате, поэтому в разделе catch вы можете return false;

Ответ 7

Итак, на этот вопрос был дан ответ, но для меня используемый код не является достаточно простым или полным. Для меня этот бит здесь - это то, что я искал, и, возможно, некоторым другим понравится это.

if (DateTime.TryParse(DateString, out DateTime Temp) == true)
{
 //do stuff
}