2010-11-16 10 views
6

Sto tentando di analizzare il seguente String in un oggetto DateTime in C#:DateTime.ParseExact non funziona affatto, perché?

DateTime.ParseExact("20101108 230125", "yyyyMMdd hhmmss", null) 

anche se il valore è corretto il metodo ParseExact mi continua a dare il seguente:

stringa non è stato riconosciuto come un DateTime valido.

Qualcuno può dirmi perché e come posso analizzare la stringa precedente senza doverla fare manualmente? ParseExact non è previsto per questo tipo di occasione?

risposta

21

Hai il formato per ore sbagliate, dovrebbe essere maiuscolo:

DateTime.ParseExact("20101108 230125","yyyyMMdd HHmmss", null) 

minuscole hh specifica che il tempo utilizza un orologio a 12 ore (con AM/PM). La maiuscola HH ha una durata di 24 ore.

Per informazioni dettagliate, controllare documentation of custom DateTime format strings.

+0

Perché questo causa un'eccezione? Personalmente mi aspetterei di convertire 23 in 11 piuttosto che generare un'eccezione. È ParseExact che lo causa? –

+1

@Marcus: 'ParseExact' farà ciò che dice; analizzare la stringa usando il formato * esatto * specificato. Poiché 'hh' dice di aspettarsi un valore orario di 12 ore in quella posizione,' 23' rientra chiaramente nell'intervallo di valori accettabili. Analizza la stringa esatta, non vengono effettuate conversioni. Quindi sì, l'eccezione è generata dal metodo 'ParseExact'. –

+0

Applausi per la spiegazione estesa. :) –

2

Provare a utilizzare:

var dt = DateTime.ParseExact("20101108 230125", "yyyyMMdd HHmmss", null) 

Il "hh" è per il tempo 12 ore e "HH" per 24 ore.

+0

Oops ha appena visto la risposta di Fredrik ... –