2010-04-08 8 views
25

sto usando C#, e se lo faccioPerché DateTime.ParseExact() non può analizzare AM/PM in "4/4/2010 4:20:00 PM" utilizzando "M"/"d"/"aaaa H": "mm": "ss" 'tt”

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

Il valore di ritorno è sempre 4:20 - che cosa sto facendo di sbagliato con l'utilizzo di TT?

Grazie!

+1

Diverse risposte giuste ... dato che posso scegliere una sola risposta giusta, suppongo che dovrei scegliere il primo essere presentato? – Jimmy

risposta

54

Fai il formato ora (H) minuscolo come questo:

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

Maiuscolo "H" indica il tempo di 24 ore e minuscole "h" indica il tempo di 12 ore e rispetterà l'AM/PM nel stringa candidata.

Nota a margine: E 'meglio per fornire un esempio di IFormatProvider a metodi come questo (anche se è solo CultureInfo.InvariantCulture). È una di quelle cose che non ha importanza fino a quando non ne hai problemi, quindi può essere utile avere l'abitudine di specificare le informazioni sulla cultura.

+0

Grazie per la nota a margine! Ne ho discusso in un'altra delle mie domande: @Jimmy: dipende dall'intenzione. In questo caso,/viene usato come una barra esatta e non come un separatore sensibile alla cultura (anche quando la cultura è InvariantCulture), quindi l'opzione che esprime meglio il tuo intento è quella con le barre quotate (quella che hai selezionato) - http : //stackoverflow.com/questions/1368636/why-cant-datetime-parseexact-parse-9-1-2009-using-md-yyyy. All'epoca ho concordato con la sua conclusione (ad esempio, utilizzare "/" e null per la cultura, piuttosto che utilizzare CultureInfo.InvariantCulture). Cosa ne pensi? – Jimmy

+0

Ottimo! Era il CultureInfo.InvariantCulture che mancava nel mio caso, il caso in cui avevo una "h" minuscola e ancora non si analizzava! – edosoft

1

È necessario utilizzare una "h" minuscola per l'argomento dell'ora nella stringa di formato. La "H" maiuscola rappresenta il tempo di 24 ore, quindi "4" è riconosciuto come 4 AM (poiché "16" sarebbe 4 PM).

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

provare le seguenti:

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

Questo uscite:

4/4/2010 4:20:00 PM 
Problemi correlati