¿Convertir 20121004 (aaaaMMdd) a una fecha válida?

Tengo una cadena en el siguiente formato yyyyMMdd y estoy intentando que se vea así:

yyyy-MM-dd

Cuando bash

 string date = "20121004"; Convert.ToDateTime(date).ToString("yyyy-MM-dd"); 

Me sale el error

FormatException: String was not recognized as a valid DateTime.

¿Funcionaría lo siguiente o me encontraría con un problema?

 private string GetValidDate(string date,string format) { DateTime result; if(DateTime.TryParseExact(date, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out result)) { return date; } else if(DateTime.TryParseExact(date, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out result)) { return DateTime.ParseExact(date, "yyyyMMdd", CultureInfo.InvariantCulture).ToString("yyyy-MM-dd"); } else { return "Invalid Date Format"; } } 

Solo usa el método DateTime.ParseExact :

 string date = "20121004"; string result = DateTime.ParseExact(date, "yyyyMMdd", CultureInfo.InvariantCulture).ToString("yyyy-MM-dd"); 

Esto también proporciona la ventaja de validar la fecha antes de reformatearla con los guiones. ParseExact lanza una excepción que puede capturar, si la fecha no está en un rango válido, o si el formato no coincide.

Me sale el error

FormatException: la cadena no se reconoció como un DateTime válido.

Recibes este error porque no le estás diciendo al método ToDateTime () cómo averiguar para analizar tu cadena.

Si usas el siguiente método:

 public static DateTime ParseExact( string s, string format, IFormatProvider provider, DateTimeStyles style ) 

No obtendrá este error. Después de generar una variable DateTime, solo muéstrela en el formato yyyy-dd-mm utilizando el método ToString ().

 public string ToString( string format, IFormatProvider provider ) 

http://msdn.microsoft.com/en-us/library/8tfzyc64
http://msdn.microsoft.com/en-us/library/9h21f14e

Sé que esto básicamente repite la misma información que todos los demás, pero también le brinda la capacidad de comprender qué hacen realmente los dos métodos que necesita usar.

Aquí hay un método de extensión que utilizo.

 ///  /// Converts a string to a dateTime with the given format and kind. ///  /// The date time string. /// The date time format. /// Kind of the date time. ///  public static DateTime ToDateTime(this string dateTimeString, string dateTimeFormat, DateTimeKind dateTimeKind) { if (string.IsNullOrEmpty(dateTimeString)) { return DateTime.MinValue; } DateTime dateTime; try { dateTime = DateTime.SpecifyKind(DateTime.ParseExact(dateTimeString, dateTimeFormat, CultureInfo.InvariantCulture), dateTimeKind); } catch (FormatException) { dateTime = DateTime.MinValue; } return dateTime; } 

Es un poco feo, pero ¿qué tal esto?

 date.Insert(6, "-").Insert(4, "-"); 

Si puede asumir que viene con una cadena que representa una fecha válida y no necesita hacer ninguna otra lógica de fecha-ish, entonces ¿por qué ir a DateTime en primer lugar?