2009-12-11 8 views
6

He publicado una pregunta sobre DateTime para la conversión de cadenas, obtuve muchas respuestas satisfactorias para eso ... así que agradezco mucho a StackOverflow. .
Aquí es un problema más de los Hilos manupulation, estoy pegado con ..

tengo para convertir una cadena (de alguna fuente externa) usando el código C# .. la cadena puede tener estos formato esperado de DateTime ..
C#: Cómo convertir cadena a DateTime, donde la cadena puede tener cualquiera de los formatos estándar de fecha y hora

  1. 02/31/2009 01:59:59                   24 horas Formato Formato de
  2. 02/31/2009 01:59:59 AM       12 horas
  3. 2/31/2009 1:59:59
  4. 2/31/2009 1:59:59 AM
  5. 02/01/2009 01:59:59 AM
  6. 2/1/2009 1:59:59
  7. y así sucesivamente .......

He intentado utilizar DateTime(Convert.ToInt32(string_date.Substring(6,4)),Int,Int,Int,Int,Int,Int)
es decir, extrayendo los valores de mes, día, etc.

Pero no funciona .. porque no puedo extraer los valores con subcadena perfectamente .. como la longitud de la cadena es variando
también han tratado de extraer los valores de referencia de la ocurrencia de "/", " espacio" y ":" pero se convierte en el cuello de botella para derivar con Ocurrencia (no) de AM/PM

Sólo la duración del día, el mes y las horas puede variar ..

Respuesta

23

Puede utilizar la sobrecarga de DateTime.ParseExact que toma una lista de formatos:

private static string[] formats = new string[] 
    { 
     "MM/dd/yyyy HH:mm:ss tt", 
     "MM/dd/yyyy HH:mm:ss", 
     "M/dd/yyyy H:mm:ss tt", 
     "M/dd/yyyy H:mm:ss"   
    }; 

private static DateTime ParseDate(string input) 
{ 
    return DateTime.ParseExact(input, formats, CultureInfo.InvariantCulture, DateTimeStyles.None); 
} 

Esto lanzará un FormatException si la cadena pasada no coincide cualquiera de los formatos dados. Observe que los formatos que esperan AM/PM deben aparecer antes de formatos idénticos sin AM/PM ("MM/dd/yyyy HH:mm:ss tt" viene antes de "MM/dd/yyyy HH:mm:ss").

actualización
Como Henk puntos en los comentarios, la misma funcionalidad está disponible cuando se utiliza TryParseExact que elimina situación de excepción. Además, emparejado con tipos anulables Esto se puede hacer un poco más limpia:

private static DateTime? ParseDate(string input) 
{ 
    DateTime result; 
    if (DateTime.TryParseExact(input, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out result)) 
    { 
     return result; 
    } 
    return null; 
} 

Ahora se devuelva una referencia nula si no se analiza la entrada.

+4

Esta sobrecarga también existe para TryParseExact, no hay razón para dejar que sea una excepción . –

+0

@Henk: gracias. Lo esperaba, pero no lo encontré.Ahora me doy cuenta de que solo estaba mirando 'TryParse' ... –

+0

+1 Buen fragmento! –

7

Eche un vistazo al método TryParseExact. He aquí un ejemplo con el primer caso:

DateTime date; 
// I changed 02/31/2009 to 01/31/2009 because the first is not a valid date 
if (DateTime.TryParseExact("01/31/2009 01:59:59", "MM/dd/yyyy HH:mm:ss", null, DateTimeStyles.None, out date)) 
{ 
    // string successfully parsed => do something with the date 
} 

A continuación, puede mantener una lista de diferentes formatos y tratar de analizar la cadena con todos ellos hasta que tenga éxito.

+2

¿hay alguna otra EFICAZ camino .. ? Quiero decir que es doloroso escribir ESAS MUCHAS LÍNEAS tantas líneas tengo como opciones ... –

0

DateTime dt1 = DateTime.ParseExact ("2007/01/01 04:23:12", "AAAA/MM/dd hh: mm: ss", System.Globalization.CultureInfo.CurrentCulture);

DateTime dt = Convert.ToDateTime ("2007/01/01 04:23:12", System.Globalization.CultureInfo.CurrentCulture);

System.Globalization.CultureInfo.CurrentCulture formato de parámetro

+0

no funciona ... pero gracias por intentarlo ... –

2

Aquí están todos los formatos posibles ..

  1. MM/dd/aaaa 08/22/2006
  2. dddd, dd MMMM aaaa martes 22 de agosto de de 2006
  3. dddd, dd MMMM aaaa hh: mm martes 22 de de agosto de de 2006 06:30
  4. dddd, dd MMMM aaaa hh: mm tt martes 22 de agosto de 2006 06:30 AM
  5. dddd, dd MMMM aaaa H: mm Martes, 22 de agosto de 2006 06:30
  6. dddd, dd MMMM aaaa h: mm tt Martes, 22 de agosto de 2006 06:30 AM
  7. dddd, dd MMMM HH aaaa: mm: ss Martes, 22 de agosto 2006 06:30:07
  8. mM/dd/aaaa hh: mm: 08/22/2006 06:30
  9. mM hh/dd/aaaa: mm tt 08/22/2006 06:30 AM
  10. mM/dd/aaaa H: mm 08/22/2006 06:30
  11. mM/dd/aaaa hh: mm: ss 08/22/2006 06:30:07
  12. MMMM dd 22 de agosto de
  13. aaaa '-' MM '-' dd'T'HH ':' mm ':' ss.fffffffK 2006-08-22T06: 30: 07,7199222-04: 00
  14. ddd, dd MMM aaaa HH ':' mm ':' ss 'GMT' mar, 22 de agosto de 2006 06:30:07 GMT
  15. aaaa '-' MM '-' dd'T'HH ':' mm ' : 'ss 2006-08-22T06: 30: 07
  16. HH: mm 06:30
  17. hh: mm tt 06:30 AM
  18. H: mm 06:30
  19. h: mm tt 06:30 AM
  20. HH: mm: ss 06:30:07
  21. aaaa '-' MM '-' DD HH ':' mm ':' ss'Z' 2006-08 -22 06: 30: 07Z
  22. dddd, dd MMMM aaaa hh: mm: ss Martes, 22 de de agosto de 2006 06:30:07
  23. aaaa MMMM 2006 agosto
Cuestiones relacionadas