2011-01-17 18 views
54

Tengo la siguiente fecha en formato de cadena "2011-29-01 12:00 a.m.". Ahora estoy tratando de convertir a formato de fecha y hora que con el siguiente código:DateTime.TryParse problema con las fechas del formato aaaa-dd-MM

DateTime.TryParse(dateTime, out dt); 

Pero estoy recibiendo alwayws dt como {1/1/0001 12:00:00 AM}, ¿Puede usted decirme por qué? y cómo puedo convertir esa cadena a la fecha.

EDITAR: Acabo de ver a todos los mencionados utilizar el argumento de formato. Mencionaré ahora que no puedo usar el parámetro de formato ya que tengo alguna configuración para seleccionar el formato de fecha personalizado que el usuario desea y, en base a ese usuario, puedo obtener la fecha en el cuadro de texto en ese formato automáticamente a través de jQuery datepicker.

+3

Por cierto, se puede determinar si la conversión no comprobando el valor de retorno de 'TryParse'. Eso es 'bool success = DateTime.TryParse (...);'. –

Respuesta

131

Esto debería funcionar sobre la base de su ejemplo "2011-29-01 12:00 AM"

DateTime dt; 
DateTime.TryParseExact(dateTime, 
         "yyyy-dd-MM hh:mm tt", 
         CultureInfo.InvariantCulture, 
         DateTimeStyles.None, 
         out dt); 
+7

Muéstremelo. Si conoce el formato de su cadena de entrada, debe usar prácticamente siempre los métodos TryParseExact/ParseExact. –

+0

está bien, entonces mi formato de fecha es similar al del ejemplo, pero si el valor de día o de mes es de un solo dígito, el analizador de DateTime arrojará un error, porque buscó dos dígitos cuando solo hay uno. ¿Qué sugieres en este escenario? –

+9

Para responder a mi propia pregunta, en este caso, si usa un solo carácter en el formato, funciona para las fechas de caracteres simples y dobles. p. d/m/aaaa funciona el 13/11/2012 –

4

De DateTime en MSDN:

Tipo:% System.DateTime Cuando devuelve este método contiene el valor DateTime equivalente a la fecha y hora que figura en s, si la conversión tuvo éxito, o MinValue si la conversión falló. La conversión falla si el parámetro s es nulo, es una cadena vacía (""), o no contiene una representación de cadena válida de una fecha y hora. Este parámetro se pasa sin inicializar.

Utilice parseexact con el formato de cadena "yyyy-dd-MM hh:mm tt" en su lugar.

+1

upvote para conversión fallida valor de retorno –

9

Necesita usar el ParseExact method. Esto toma una cadena como su segundo argumento que especifica el formato de la fecha y hora es en, por ejemplo:

// Parse date and time with custom specifier. 
dateString = "2011-29-01 12:00 am"; 
format = "yyyy-dd-MM h:mm tt"; 
try 
{ 
    result = DateTime.ParseExact(dateString, format, provider); 
    Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); 
} 
catch (FormatException) 
{ 
    Console.WriteLine("{0} is not in the correct format.", dateString); 
} 

Si el usuario puede especificar un formato en la interfaz de usuario, entonces usted necesita para traducir eso en una cadena que puede pasar en este método. Puede hacerlo permitiendo que el usuario ingrese la cadena de formato directamente, aunque esto significa que es más probable que la conversión falle, ya que ingresará ingrese una cadena de formato no válida o que tenga un cuadro combinado que los presente con las posibles opciones y configura las cadenas de formato para estas opciones.

Si es probable que la entrada será (entrada del usuario, por ejemplo) incorrectos sería mejor utilizar TryParseExact en lugar de excepciones para manejar el caso de error:

// Parse date and time with custom specifier. 
dateString = "2011-29-01 12:00 am"; 
format = "yyyy-dd-MM h:mm tt"; 
DateTime result; 
if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out result)) 
{ 
    Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); 
} 
else 
{ 
    Console.WriteLine("{0} is not in the correct format.", dateString); 
} 
3

que funciona:

DateTime dt = DateTime.ParseExact("2011-29-01 12:00 am", "yyyy-dd-MM hh:mm tt", System.Globalization.CultureInfo.InvariantCulture); 
0

Si le da al usuario la oportunidad de cambiar el formato de fecha/hora, tendrá que crear una cadena de formato correspondiente para usar en el análisis. Si conoce los posibles formatos de fecha (es decir, el usuario tiene que seleccionar de una lista), esto es mucho más fácil porque puede crear esas cadenas de formato en tiempo de compilación.

Si le permite al usuario hacer un diseño de formato libre del formato de fecha/hora, entonces deberá crear las cadenas de formato DateTime correspondientes en tiempo de ejecución.

+0

Correcto jim Si le permite al usuario hacer un diseño de formato de fecha/hora en formato libre, deberá crear las cadenas de formato DateTime correspondientes en el tiempo de ejecución. – Pinal

2

Trate de usar el método TryParseExact segura

DateTime temp; 
string date = "2011-29-01 12:00 am"; 

DateTime.TryParseExact(date, "yyyy-dd-MM hh:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out temp); 
1
DateTime dt = DateTime.ParseExact("11-22-2012 12:00 am", "MM-dd-yyyy hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);