2010-02-24 14 views
7

Quiero comprobar si una fecha tiene un formato correcto. Hay muchas posibilidades de fechas correctas como:DateTime.TryParse todo tipo posible de fechas

  • 02.08.2010
  • 2.8.2010
  • 02.8.2010 02,08
  • 02.August
  • ...

I puede probar cada uno con un código como este:

if (DateTime.TryParse(DateTime.ParseExact(date, "dd.M.", 
           new CultureInfo("sl-SI")).ToString(), out dt)) 

Pero luego puedo tener 40 declaraciones if. ¿Es posible verificar todas las fechas con una declaración if o un ciclo?

Actualización:

Sobre la base de las respuestas hasta ahora, estoy probando este código, pero tienen un problema más. ¿Y si tengo solo 9.2 no 9.2.2010 continuación, este código no funcionará:

CultureInfo ci = CultureInfo.GetCultureInfo("sl-SI"); 
string[] fmts = ci.DateTimeFormat.GetAllDateTimePatterns(); 

if (DateTime.TryParseExact(date, fmts, ci, DateTimeStyles.AssumeLocal, out dt)) 
{ 
    DateTime = Convert.ToDateTime(date); 
    Check = true; 
} 

Debo añadir manualmente estos tiempos o qué puedo hacer?

+0

¿Por qué acepta todos los formatos posibles de fecha como entrada válida? –

+0

por favor agregue actualizaciones a su pregunta o use la función de comentarios. También, por favor no use las respuestas para decir gracias, use un comentario o mejor, voto positivo y marque como aceptado: http://blog.stackoverflow.com/2011/01/how-to-say-thanks-in-an-answer/ – Kev

+0

Puede que desee ver esto también [robust-datetime-parser-library-for-net] (http://stackoverflow.com/questions/7297622/robust-datetime-parser-library-for-net) – nawfal

Respuesta

8

se puede usar algo como lo siguiente, pero tenga en cuenta que más de un formato podría ser capaz de analizar la misma fecha. Por ejemplo, 10/11/12 se puede analizar como aa/MM/dd o MM/dd/aa, que son formatos de fecha válidos en los EE. UU. MM/dd/aa es más común, por lo que aparece primero en la lista y es el que arroja el siguiente código (si lo usa con una cultura de EE. UU. En lugar de la cultura del ejemplo).

string testValue = "10.11.12"; 

DateTime result; 
CultureInfo ci = CultureInfo.GetCultureInfo("sl-SI"); 
string[] fmts = ci.DateTimeFormat.GetAllDateTimePatterns(); 
Console.WriteLine(String.Join("\r\n", fmts)); 
if (DateTime.TryParseExact(testValue, fmts, ci, 
    DateTimeStyles.AssumeLocal, out result)) 
{ 
    Console.WriteLine(result.ToLongDateString()); 
} 
+3

En el parte del mundo donde vivo, los humanos lo analizarían como "dd.mm.yy". Teniendo esto en cuenta, toda la pregunta tiene poco sentido, porque es propensa a errores de interpretación. –

9

ParseExact puede tomar una lista de formatos para comprobar.

var formats = new[] { "M.d.yyyy", "dd.MM.yyyy" }; 
var dateValue = DateTime.ParseExact(
    dateString, formats, new CultureInfo("sl-SI"), DateTimeStyles.None); 
Cuestiones relacionadas