.net - net - datetime now format
¿Por qué no puede DateTime.ParseExact() analizar "9/1/2009" con "M/d/aaaa" (7)
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".
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?
Establezca la propiedad Format de DateTimePicker en propiedades personalizadas y CustomFormat en M/dd/yyyy
.
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.
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"));
Tratar :
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 ("08/21/2013", "MM / dd / aaaa", nulo);
URL de referencia: http://support.microsoft.com/kb/306162/
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.