2010-04-08 13 views
25

estoy usando C#, y si lo hago¿Por qué no puede DateTime.ParseExact() analizar el AM/PM en “4/4/2010 4:20:00 PM” mediante “M '/' d '/' aaaa H ':' mm ':' ss' 'tt”

DateTime.ParseExact("4/4/2010 4:20:00 PM", "M'/'d'/'yyyy H':'mm':'ss' 'tt", null) 

El valor de retorno es siempre 4:20 AM - ¿qué estoy haciendo mal con el uso tt?

Gracias!

+1

Varias respuestas correctas ... ya que sólo se puede elegir una respuesta correcta, supongo que debería escoger el primero ¿para ser enviado? – Jimmy

Respuesta

54

hacer el modelo horas (H) minúsculas como esto:

DateTime.ParseExact(
      "4/4/2010 4:20:00 PM", 
      "M/d/yyyy h:mm:ss tt", 
      CultureInfo.InvariantCulture); 

mayúsculas "H" indica tiempo de 24 horas y minúsculas "h" indica el tiempo de 12 horas y respetará la AM/PM en el cadena de candidato

Nota al margen: Lo mejor es proporcionar una instancia de IFormatProvider a métodos como éste (incluso si es sólo CultureInfo.InvariantCulture). Es una de esas cosas que realmente no importan hasta que te topas con problemas, por lo que puede ser bueno tener el hábito de especificar la información cultural.

+0

¡Gracias por la nota al margen! Discutí esto en otra de mis preguntas: @Jimmy: depende de la intención. En este caso,/se usa como una barra diagonal exacta y no como un separador cultural (incluso cuando la cultura es InvariantCulture), por lo que la opción que expresa mejor su intención es la que tiene barras inclinadas (la que eligió) - http : //stackoverflow.com/questions/1368636/why-cant-datetime-parseexact-parse-9-1-2009-using-md-yyyy. En el momento en que estuve de acuerdo con su conclusión (es decir, use '/' y null para la cultura, en lugar de usar CultureInfo.InvariantCulture). ¿Qué piensas? – Jimmy

+0

¡Genial! Era el CultureInfo.InvariantCulture que faltaba en mi caso, casue Tenía una 'h' minúscula y todavía no analizaba! – edosoft

1

Es necesario utilizar una minúscula "h" para el argumento horas en la cadena de formato. La "H" mayúscula representa la hora de 24 horas, por lo que "4" se reconoce como 4 AM (ya que "16" sería 4 PM).

DateTime.ParseExact("4/4/2010 4:20:00 PM", "M/d/yyyy h:mm:ss:tt", null) 
3

Pruebe las siguientes:

Console.WriteLine(DateTime.ParseExact("4/4/2010 4:20:00 PM", "M'/'d'/'yyyy h':'mm':'ss tt", null)); 

Este salidas:

4/4/2010 4:20:00 PM 
Cuestiones relacionadas