2010-08-23 12 views
8
DateTime dt = DateTime.ParseExact("1122010", "Mddyyyy", System.Globalization.CultureInfo.CurrentCulture); 

Throwing this exception: String non è stato riconosciuto come DateTime valido.Parse Simple DateTime

Sono sicuro che è la mancanza di uno 0 iniziale nel mese. Qual è la stringa di formato corretta?

+0

L'esempio del codice è probabilmente per dimostrare il tipo di stringa che si sta analizzando. Ma se davvero stai definendo il tuo codice in questo modo, allora smetti di farlo :) Usa i costruttori/metodi di 'DateTime' che ti permettono di specificare esplicitamente la data. –

+0

@Merlyn, presumo che stia ottenendo i dati da una fonte esterna come un file flat, un servizio, ecc. Non penso che sarà codificato. –

+0

Sì, proviene da un file di lunghezza fissa. Sarebbe stupido da parseexact una stringa hard coded ottenere un'istanza datetime. – Darthg8r

risposta

11

Suggerisco di utilizzare il formato "MMddyyyy" e di garantire che il parametro di input abbia almeno 8 caratteri. Esempio:

DateTime dt = DateTime.ParseExact("1122010".PadLeft(8, '0'), "MMddyyyy", System.Globalization.CultureInfo.CurrentCulture); 

Se si utilizza una sorgente di dati con lo 0 mancante per il mese, questo aggiungerà là dove necessario.

+0

Questo è uno scenario caso speciale e probabilmente l'unica soluzione possibile. MSDN: se non si utilizzano separatori di data o ora in un modello di formato personalizzato, utilizzare la cultura invariabile per il parametro provider e la forma più ampia di ciascun identificatore di formato personalizzato. Ad esempio, se si desidera specificare ore nel motivo, specificare la forma più ampia, "HH", anziché la forma più stretta, "H". – chilltemp

+0

Nota che il padding funziona solo per mesi inferiori al numero 10. Se provi lo stesso con un numero di giorni inferiore a 10, potrebbero apparire delle date dispari. O anche entrambi: ''112010' -> '00112010'' Sono d'accordo nel garantire gli otto caratteri. – Caramiriel

4

Il problema è che non si forniscono a ParseExact informazioni sufficienti con cui lavorare.

"M" indica un mese a 1 o 2 cifre. Ma la tua stringa inizia con "1122". È il 12 gennaio o il 22 novembre?

L'unica soluzione, come mostra Anthony, è di eseguire il pad con 0 quando necessario.

1

La singola stringa di formato "M" non è accettabile perché non tutti i mesi possono essere rappresentati in modo univoco con una singola cifra o carattere. Come precedentemente suggerito, dovrai usare "MMddyyyy" e tamponare la stringa sinistra quando necessario.