2010-08-23 8 views
8
DateTime dt = DateTime.ParseExact("1122010", "Mddyyyy", System.Globalization.CultureInfo.CurrentCulture); 

Lanzando esta excepción: String no fue reconocido como un DateTime válido.Parse Simple DateTime

Estoy seguro de que es la falta de un 0 en el mes. ¿Cuál es la cadena de formato correcta?

+0

Su ejemplo de código probablemente demuestre el tipo de cadena que está analizando. Pero si de verdad está definiendo su código de esta manera, entonces deje de hacerlo :) Use los constructores/métodos de 'DateTime' que le permiten especificar la fecha explícitamente. –

+0

@Merlyn, supongo que está obteniendo los datos de una fuente externa, como un archivo plano, servicio, etc. No creo que esto vaya a estar codificado. –

+0

Sí, es de un archivo de longitud fija. Sería tonto parseexactuar una cadena codificada obtener una instancia de fecha y hora. – Darthg8r

Respuesta

11

sugiere emplear el formato "MMDDAAAA" y asegurando que su parámetro de entrada tiene al menos 8 caracteres. Ejemplo:

DateTime dt = DateTime.ParseExact("1122010".PadLeft(8, '0'), "MMddyyyy", System.Globalization.CultureInfo.CurrentCulture); 

Si está utilizando una fuente de datos con el 0 a la falta para el mes, esto añadirá que cuando sea necesario.

+0

Este es un escenario de caso especial, y probablemente la única solución posible. MSDN: si no usa separadores de fecha u hora en un patrón de formato personalizado, use el cultivo invariante para el parámetro de proveedor y la forma más amplia de cada especificador de formato personalizado. Por ejemplo, si desea especificar horas en el patrón, especifique la forma más amplia, "HH", en lugar de la forma más estrecha, "H". – chilltemp

+0

Tenga en cuenta que el relleno solo funciona durante meses más bajo que el número 10. Si prueba lo mismo con un número de día inferior a 10, pueden aparecer fechas impares. O incluso ambos: ''112010 '->' 00112010'' Sin embargo, estoy de acuerdo en asegurar los ocho caracteres. – Caramiriel

4

El problema es que no le está dando a ParseExact la información suficiente para trabajar.

"M" significa un mes de 1 o 2 dígitos. Pero su cadena comienza con "1122". ¿Es eso el 12 de enero o el 22 de noviembre?

La única solución, como muestra Anthony, es a almohadilla con un 0 cuando sea necesario.

1

La cadena de formato sencillo "M" es inaceptable porque no todos los meses se pueden representar de forma única con un solo dígito o carácter. Como se sugirió anteriormente, deberá usar "MMddyyyy" y rellenar la cadena izquierda cuando sea necesario.