2010-10-19 15 views
18

Necesito analizar cadena a DateTime. La cadena siempre tiene el siguiente formatoNecesita parse dd.MM.aaaa a DateTime con TryParse

"10.10.2010" Eso significa dd.MM.aaaa, separado con puntos.

Quiero utilizar DateTime.TryParse o cualquier otro método. Por favor recomiende.

ACTUALIZACIÓN

ha actualizado la pregunta. Solo estoy buscando el método correcto para lograr el objetivo. No manual de análisis

Respuesta

39

TryParse no le permite especificar el formato - pero se puede utilizar TryParseExact:

DateTime date; 
if (DateTime.TryParseExact(text, "dd'.'MM'.'yyyy", 
          CultureInfo.InvariantCulture, 
          DateTimeStyles.None, 
          out date)) 
{ 
    // Success 
} 
else 
{ 
    // Parse failed 
} 

Tenga en cuenta que el punto no necesita escaparse estrictamente con las comillas, pero personalmente me gusta poner cualquier texto literal entre comillas solo para asegurarme de que no se cambiará. Sin embargo, es una cuestión de preferencia personal; sin dudas, podrías usar "dd.MM.aaaa" si quisieras.

Del mismo modo que he especificado la cultura invariante que es lo que normalmente hago para un estilo personalizado fijo, pero podría hacer que utilice la cultura actual o una cultura específica si lo desea. Cuando se usa un estilo personalizado (en lugar de un estilo estándar como "fecha larga") es menos probable que haga una diferencia, en verdad.

+0

Genial, gracias Jon. –

+0

¿Qué pasa si me veo forzado a escribir tryparse entonces hay algún trabajo? – Neel

+0

@Neel: ¿Por qué te verías obligado a utilizar 'TryParse'? ¿Qué otras restricciones hay? ¿Definitivamente sabes el formato?¿Puedes especificar la cultura en la llamada 'TryParse'? –

4

¿Por qué no utilizar ParseExact en su lugar?

var theDate = DateTime.ParseExact("dd.MM.yyyy", yourDateString, CultureInfo.InvariantCulture); 
+1

-1 no del todo - esto puede lanzar excepciones ... – Dror

+0

@Dror, si se lee la pregunta verá esto: "La cadena es siempre en el siguiente formato", lo que significaría que el PO podía use fácilmente ParseExact. Y podría usar un bloque de captura de prueba a su alrededor si es necesario. –

+0

No compila –

7

Utilice el método TryParseExact:

DateTime parsed; 
if (DateTime.TryParseExact(yourString, "dd'.'MM'.'yyyy", 
    CultureInfo.CurrentCulture, DateTimeStyles.None, out parsed)) 
{ 
    // success 
} 
+0

'null' no es un valor' DateTimeStyles' válido. –

+0

@Jon: Sí, me di cuenta de eso. Editando ... – LukeH

4

Brasil códec

public static bool IsDateTime(string txtDate) 
{ 
    DateTime tempDate; 

    return DateTime.TryParseExact(txtDate,"dd/MM/yyyy", 
           new CultureInfo("pt-BR"), 
           DateTimeStyles.None, out tempDate); 
} 
1

probarlo "ddMMyyy", sin "- /".

0

He encontrado que jquery datepicker agregará caracteres no imprimibles en la cadena. Por lo tanto, cuando intente convertir a otro formato, arrojará un error de fecha no válida cada vez. En mi caso, solo estaba tratando de convertirlo nuevamente a una marca de tiempo de cualquier cultura en la que el usuario estaba en ese momento. Es un enfoque algo hacky, pero funcionó para mí.

static public string ToDigitsOnly(string input) 
    { 
     Regex digitsOnly = new Regex(@"[^\d]"); 
     return digitsOnly.Replace(input, ""); 
    } 

    static private DateTime ConvertDateTimeToDate(string dateTimeString, String langCulture) 
    { 

     System.DateTime result; 

     string[] dateString = dateTimeString.Split('/'); 


     try 
     { 
      if (langCulture != "en") 
      { 
       int Year = Convert.ToInt32(ToDigitsOnly(dateString[2])); 
       int Month = Convert.ToInt32(ToDigitsOnly(dateString[1])); 
       int Day = Convert.ToInt32(ToDigitsOnly(dateString[0])); 
       result = new DateTime(Year, Month, Day, 00, 00, 00); 
      } 
      else 
      { 
       int Year = Convert.ToInt32(dateString[2]); 
       int Month = Convert.ToInt32(dateString[0]); 
       int Day = Convert.ToInt32(dateString[1]); 
       result = new DateTime(Year, Month, Day, 00, 00, 00); 
      } 
     } 
     catch 
     { 
      // last attempt 
      result = Convert.ToDateTime(dateTimeString, CultureInfo.GetCultureInfo("en-US")); 
     } 

     return result; 
    }