¿Por qué no puede DateTime.ParseExact () analizar “9/1/2009” con “M / d / aaaa”

Tengo una cadena que se ve así: “9/1/2009”. Quiero convertirlo a un objeto DateTime (usando C #).

Esto funciona:

DateTime.Parse("9/1/2009", new CultureInfo("en-US")); 

Pero no entiendo por qué esto no funciona:

 DateTime.ParseExact("9/1/2009", "M/d/yyyy", null); 

No hay palabra en la fecha (como “septiembre”), y conozco el formato específico, así que prefiero usar ParseExact (y no veo por qué se necesitaría CultureInfo). Pero sigo recibiendo la temida excepción “String no fue reconocido como un válido DateTime”.

Gracias

Un pequeño seguimiento. Aquí hay 3 enfoques que funcionan:

 DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", null); DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.InvariantCulture); DateTime.Parse("9/1/2009", new CultureInfo("en-US")); 

Y aquí hay 3 que no funcionan:

 DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.CurrentCulture); DateTime.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US")); DateTime.ParseExact("9/1/2009", "M/d/yyyy", null); 

Entonces, Parse () funciona con “en-US”, pero no con ParseExact … ¿Inesperado?

Sospecho que el problema son las barras en la cadena de formato frente a las de los datos. Ese es un carácter separador de fecha sensible a la cultura en la cadena de formato, y el argumento final es null significa “usar la cultura actual”. Si escapa de las barras diagonales (“M ‘/’ d ‘/’ yyyy”) o especifica CultureInfo.InvariantCulture , todo estará bien.

Si alguien está interesado en reproducir esto:

 // Works DateTime dt = DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", new CultureInfo("de-DE")); // Works DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US")); // Works DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.InvariantCulture); // Fails DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("de-DE")); 

Apuesto a que la cultura de su máquina no es “en-US”. De la documentación :

Si el proveedor es una referencia nula (Nothing en Visual Basic), se utiliza la cultura actual.

Si su cultura actual no es “en-US”, esto explicaría por qué funciona para mí, pero no funciona para usted y funciona cuando especifica explícitamente que la cultura es “en-US”.

Tratar

 Date.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US")) 

prueba esto

 provider = new CultureInfo("en-US"); DateTime.ParseExact("9/1/2009", "M/d/yyyy", provider); 

Adiós.

Lo probé en XP y no funciona si la PC está configurada en el tiempo internacional aaaa-Md. Coloque un punto de interrupción en la línea y antes de que se procese cambie la cadena de fecha para usar ‘-‘ en lugar del ‘/’ y verá que funciona. No importa si tiene CultureInfo o no. Parece extraño poder especificar un formato probado solo para tener el separador ignorado.

Tratar :

Configurar en el archivo de configuración web

por ejemplo: DateTime dt = DateTime.ParseExact (“08/21/2013”, “MM / dd / aaaa”, nulo);

URL de referencia: http://support.microsoft.com/kb/306162/

Establezca la propiedad Format de DateTimePicker en propiedades personalizadas y CustomFormat en M/dd/yyyy .