2009-09-02 13 views
53

Tengo una cadena que se ve así: "9/1/2009". Quiero convertirlo a un objeto DateTime (usando C#).¿Por qué no puede DateTime.ParseExact() analizar "9/1/2009" con "M/d/aaaa"

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 sé el formato específico, así que preferiría 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 poco de seguimiento. Aquí hay 3 métodos 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); 

Así, Parse() trabaja con "en-US", pero no ParseExact ... ¿Inesperado?

+0

¿Qué versión de .NET está usando? Cuando ejecuto la segunda línea anterior en PowerShell v2 en Win7, funciona bien. – Lee

+0

Estoy usando .net 3.5 en xp. La cultura predeterminada es en-us. – Jimmy

+1

En la cadena '" M/d/aaaa "', cada barra inclinada '/' se sustituye por la cadena 'culture.DateTimeFormat.DateSeparator'. Cuando le das 'null' como proveedor de formato, se utiliza la cultura actual. Ahora depende de si la cultura actual tiene '"/"' o alguna otra cadena (como '" - "' o '". "') Como su ['DateSeparator'] (http://msdn.microsoft.com/ en-us/library/system.globalization.datetimeformatinfo.dateseparator.aspx). –

Respuesta

85

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 que es null significa "utilizar la cultura actual". Si escapan las barras ("M '/' d '/' aaaa") 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")); 
+0

Tienes razón, cualquiera de esos funcionará. No estoy seguro de cuál prefiero todavía. Supongo que escapar de las barras es más compacto ... ¡Gracias, esto me ha estado molestando por un tiempo! – Jimmy

+0

No estoy seguro de por qué su segundo ejemplo funciona para usted. Eso no funciona para mí. El uso de CultureInfo ("en-US") funciona con Parse() para esta cadena de fecha, pero no funciona con ParseExact con esta cadena de fecha y cadena de formato. – Jimmy

+1

@Jimmy: depende de la intención. En este caso,/se usa como una barra diagonal exacta y * no * como separador sensible a la cultura (incluso cuando la cultura es 'InvariantCulture'), por lo que la opción que mejor expresa su intención es la que tiene barras inclinadas (la que escogido). –

2

Trate

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

Supongo que prefiero usar DateTime.Parse ("9/1/2009", nuevo CultureInfo ("en-US")) luego, si tengo que especificar la cultura de todos modos ...? – Jimmy

+0

En lugar de crear una instancia nueva de CultureInfo ("en-US") cada vez que analiza una fecha, utilice CultureInfo.InvariantCulture. – Joe

+0

En realidad, esto NO funciona (¿al menos para mí?) Usar "en-US" funciona con Parse, pero no con ParseExact (para esta fecha y cadena de formato) – Jimmy

0

probar esto

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

adiós.

2

Apuesto a que la cultura de su máquina no es "en-US". De the documentation:

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

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

+0

Nah, curiosamente, CultureInfo.CurrentCulture sí devuelve "en-us" "... así que no estoy seguro de cómo explicar por qué funcionaría para ti, pero no para mí. – Jimmy

+0

Probé algunas cosas. Esto es lo que funciona: DateTime.ParseExact ("9/1/2009", "M '/' d '/' aaaa", nulo); DateTime.ParseExact ("9/1/2009", "M/d/aaaa", CultureInfo.InvariantCulture); DateTime.Parse ("9/1/2009", nuevo CultureInfo ("en-US")); Esto es lo que no funciona: DateTime.ParseExact (dateString, "M/d/aaaa", CultureInfo.CurrentCulture); DateTime.ParseExact (dateString, "M/d/aaaa", nuevo CultureInfo ("en-US")); DateTime.ParseExact (dateString, "M/d/aaaa", nulo); Así que Parse() funciona con "en-US", pero no con ParseExact ... interesante ¿eh? – Jimmy

+0

El formato Woops se estropeó. Añadiré a la pregunta. – Jimmy

0

Lo probé en XP y no funciona si la PC está configurada en la hora internacional aaaa-M-d. 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.

-2

Establezca la propiedad Format de DateTimePicker como personalizada y CustomFormat prperty para M/dd/yyyy.

+1

Esta pregunta no tiene absolutamente nada que ver con DateTimePicker. –

-1

Probar:

Configurar en el archivo de configuración web

<system.web> <globalization culture="ja-JP" uiCulture="zh-HK" /> </system.web>

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

ref url: http://support.microsoft.com/kb/306162/

+0

No hay nada en esta pregunta que sugiera una aplicación web. –

Cuestiones relacionadas