Conversión de DateTime de la cadena C #

Tengo una cadena ( 642014 ) que tiene el formato Mdyyyy .
Quiero convertir la cadena a 04062014 ( ddMMYYYY ).
He intentado el siguiente código.
Por favor ayuda.

 DateTime.TryParseExact("642014", "MMddyyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out "04062014"); 

Ese no es un formato de fecha válido.

Para resaltar el problema, ¿es 1112014 el 1st of Nov o el 11th of Jan ?

Si tiene algún tipo de convención que le permita determinar a qué fecha se refiere en estos casos, podría hacer algún tipo de preprocesamiento o analizar la cadena manualmente, pero no encontrará nada ‘integrado’ para ese formato.

Su situación se ve como otro problema de forma más amplia .

Desde el método DateTime.TryParseExact

Si no usa separadores de fecha y hora en un patrón de formato personalizado , use el parámetro 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”.

Debido a esto, el análisis de cadenas sin separador de fecha u hora puede ser un problema a veces.

Por ejemplo, hablemos del especificador de formato personalizado "d" . Para formatear una parte, formatea la parte del día con un solo dígito sin un cero inicial. Pero para el análisis, puede analizar tanto 4 como 04 también. Es lo mismo que el especificador de formato personalizado "M" . No digo que deba usar el especificador d para 04 . Puedes, pero no deberías. Siempre debe usar los mejores formatos que se ajusten exactamente a su cadena.

Aquí está mi opinión sobre lo que está pasando aquí;

Debido a la regla de forma más amplia , dado que la cadena no tiene ningún separador de fecha, el formato debe esperar las formas más amplias de d M que son dd y MM . Pero creo que estos especificadores esperan con valores cero iniciales (por ej., 06 y 04 ) cuando usan dígitos únicos porque en realidad son para ellos . No pude encontrar ninguna evidencia para apoyar mi teoría, pero aún estoy investigando.

Tengo una solución si tus cadenas tienen siempre el formato Mdyyyy . Tal vez no sea la mejor solución, pero creo que es útil si tus cadenas tienen un formato constante;

 public static DateTime? ParseDate_Mdyyyy(string date) { if (date == null) return null; if (date.Length < 6) return null; if (date.Length == 6) date = date.Insert(0, "0").Insert(2, "0"); DateTime dt; if (DateTime.TryParseExact(date, "MMddyyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt)) return dt; return null; } 

Ahora puedes usar este método como;

 string s = "642014"; DateTime? date = ParseDate_Mdyyyy(s); Console.WriteLine(date.Value.ToString("ddMMyyyy")); // 04062014 

Me conecté al .NET Framework Team sobre este problema aquí su respuesta;

Hola Soner,

El código de análisis no está realmente buscando ningún separador. Aquí es donde está pasando:

Para el caso de usar “MMddyyyy” , el análisis comienza en el método DoStrictParse que llamará a ParseByFormat . Este método obtendrá la primera parte del formato que es “MM” y luego ParseDigits a ParseDigits para obtener los dígitos equivalentes de la cadena que “642014” lo que dará “64” . Tenga en cuenta que hasta ese momento no hay validación si el número está fuera del rango del mes en el calendario seleccionado (que es gregoriano en nuestro caso aquí) . El código de análisis repetirá el mismo proceso para “dd” y obtendrá la parte equivalente “20” y luego la repetirá para “yyyy” pero esto falla porque espera 4 dígitos y solo teníamos dos ( “14” ).

Para el caso de usar “Mdyyyy” , falla porque casi la misma razón al analizar la parte “M” sabemos que el mes puede tener 2 dígitos, por lo que lo “64” y haremos lo mismo con “d” asignarlo a “20” y luego el año fallará. Creo que esta es la razón por la cual la documentación que dice siempre usa la forma más amplia.

La recomendación aquí es usar los formularios de 2 dígitos en la cadena como "06042014" y el análisis debe tener éxito con “MMddyyyy” y “Mdyyyy” también. Otra opción es insertar separador "6/4/2014" o "06/04/2014" y analizar como "M/d/yyyy"

Gracias, Tarek

Agradecimientos especiales a; Tarek Mahmoud Sayed, Wes Haggard y Richard Lander.

Para analizar su cadena, primero agregue barras en posiciones relevantes y luego analícelas

 string str = "642014"; str = str.Insert(2,"/").Insert(1,"/"); var result = DateTime.ParseExact(str, "M/d/yyyy",CultureInfo.InvariantCulture);