2012-06-15 20 views
17

que tienen una cadena con el siguiente formato yyyyMMdd y yo estoy tratando de llegar a tener este aspecto:Convertir 20121004 (aaaamMMdd) a una fecha válida?

yyyy-MM-dd

Cuando intento:

string date = "20121004"; 

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

me sale el error:

FormatException: String was not recognized as a valid DateTime.

¿Funcionó o funcionaría int o 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"; 
    } 
} 
+1

¿Se le garantiza el formato aaaamMMdd en la cadena de origen? Si es así, ¿por qué no usar simplemente los métodos de cadena para agregar los guiones? – jglouie

+0

Pensé en eso. ¿Cuál es el mejor método para eso? – Xaisoft

+0

Hay una respuesta basada en cadenas a continuación. Parece bastante razonable – jglouie

Respuesta

28

sólo tiene que utilizar el método de 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 formatear con los guiones. ParseExact arroja una excepción que puede capturar, si la fecha no está en el rango válido, o el formato no coincide.

+0

+1 DateTime.ParseExact es la forma correcta de manejar formatos personalizados. –

+0

¿Es necesario si sé que la fecha es siempre válida? Sólo curioso. – Xaisoft

+1

Cuando se trata de fechas, personalmente creo que siempre es esencial validarlas antes de procesarlas más. –

3

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

/// <summary> 
/// Converts a string to a dateTime with the given format and kind. 
/// </summary> 
/// <param name="dateTimeString">The date time string.</param> 
/// <param name="dateTimeFormat">The date time format.</param> 
/// <param name="dateTimeKind">Kind of the date time.</param> 
/// <returns></returns> 
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; 
} 
+0

¿Puedes mostrar un ejemplo de llamada o explicar qué tipo de DateTimeKinds se puede usar? –

0

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

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

Si se puede suponer que está entrando con una cadena que representa una fecha válida y no es necesario hacer ninguna otra lógica fecha-ish, entonces ¿por qué ir a un DateTime en el primer lugar?

+0

Quizás deba asegurarse primero de que la fecha sea válida. El '' DateTime.ParseExact'' simplemente hace esto. –

+2

La verdadera pregunta es por qué su código no funciona. Si bien este código básicamente le dará lo que quiere, parece tonto, proporcionar un código feo. –

+0

+1, él solo está tratando de agregar hypthens en. Y quiere que se muestre como una fecha válida, también conocido como formato correcto. No especifica que la fecha sea válida y, como tal, podemos suponer que su fecha ya es válida. – Doomsknight

-1
string date = "20121004"; 
date = date.Insert(6,"-"); 
date = date.Insert(4,"-"); 
+0

Si el usuario usara este código, 'date' solo sería igual a' 10-04', lo que claramente no es lo que quiere. Además, permitiría la cadena "20129999", que claramente no es una fecha válida. –

+0

@Ramhound: el código establece 'date' to' "2012-10-04" '. ¿Por qué crees que será '10-04'? – comecme

5

I get the error:

FormatException: String was not recognized as a valid DateTime.

que está recibiendo este error, ya que no está diciendo al método ToDateTime() cómo averiguar para analizar su cadena.

Si se utiliza el siguiente método:

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

Usted no recibirá este error. Después de generar una variable DateTime simplemente 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 proporciona la capacidad de entender lo que los dos métodos que tiene que ir en realidad hace.

+0

Gracias a la explicación detallada. – Xaisoft

Cuestiones relacionadas