Verifique se uma string é uma data válida usando DateTime.TryParse

Eu estou usando a function DateTime.TryParse() para verificar se uma determinada seqüência de caracteres é um datetime válido não depende de culturas.
Para minha surpresa, a function retorna true para strings pares como “1-1”, “1/1” .etc.

Como posso resolver este problema?

Atualizar:

Isso significa que, se eu quiser verificar se uma string específica é datetime válida, eu preciso de uma grande variedade de formatos? Haverá combinações diferentes, eu acredito.
Mesmo que haja muitos separadores de datas (‘.’, ‘/’, ‘-‘, etc ..) dependendo da cultura, será difícil para mim definir uma matriz de formato a ser verificada.
Basicamente, eu quero verificar se uma string específica contém pelo menos o dia (1 a 31 ou 01 a 31), mês (1 a 12 ou 01 a 12) e ano (aaaa ou aa) em qualquer ordem, com qualquer separador de data, qual será a solução?
Então, se o valor include alguma parte do tempo, ele deve retornar true também. Eu não consegui definir uma matriz de formato.

Se você quiser que suas datas estejam em conformidade com um formato ou formatos específicos, use DateTime.TryParseExact caso contrário esse é o comportamento padrão de DateTime.TryParse

DateTime.TryParse

Esse método tenta ignorar dados não reconhecidos , se possível, e preenche as informações de mês, dia e ano que faltam com a data atual. Se s contiver apenas uma data e nenhuma hora, este método assume que o horário é 12:00 da meia-noite. Se s include um componente de data com um ano de dois dígitos, ele será convertido em um ano no calendar atual da cultura atual com base no valor da propriedade Calendar.TwoDigitYearMax. Qualquer caractere de espaço em branco inicial, interno ou final em s é ignorado.

Se você deseja confirmar em vários formatos, em seguida, examine a sobrecarga de DateTime.TryParseExact Method (String, String [], IFormatProvider, DateTimeStyles, DateTime) . Exemplo do mesmo link:

 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. 

Use DateTime.TryParseExact() se quiser corresponder a um formato de data específico

  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"); } 
 [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); } 

Basta especificar os formatos de data e hora que você deseja aceitar na matriz denominada formatos .

Eu resolvi o problema com o seguinte código:

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

Basicamente, eu quero verificar se uma string específica contém pelo menos o dia (1 a 31 ou 01 a 31), mês (1 a 12 ou 01 a 12) e ano (aaaa ou aa) em qualquer ordem, com qualquer separador de data, qual será a solução? Então, se o valor include alguma parte do tempo, ele deve retornar true também. Eu não consegui definir uma matriz de formato.

Quando eu estava em uma situação semelhante, aqui está o que eu fiz:

  1. Reúna todos os formatos que meu sistema deve suportar.
  2. Olhou para o que é comum ou pode ser generalizado.
  3. Aprendi a criar o REGEX (inicialmente, é um investimento de tempo, mas compensa quando você cria um ou dois por conta própria). Também não tente construir o REGEX para todos os formatos de uma vez, siga o processo incremental.
  4. Eu criei REGEX para cobrir o maior formato possível.
  5. Em alguns casos, para não complicar o REGEX, eu o cobri pelo método DateTime.Parse ().
  6. Com a combinação do Parse e do REGEX, eu consegui validar que a input está correta / conforme o esperado.

Este http://www.codeproject.com/Articles/13255/Validation-with-Regular-Expressions-Made-Simple foi muito útil para entender e validar a syntax de cada formato.

Meus 2 centavos se ajuda ….

Tente usar

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

Ele lança uma exceção se a string de input não estiver no formato adequado, portanto, na seção catch , você pode return false;

Portanto, esta pergunta foi respondida, mas para mim o código usado não é simples ou completo. Para mim esta parte aqui é o que eu estava procurando e, possivelmente, algumas outras pessoas vão gostar disso também.

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