2011-01-17 9 views
54

Ho la seguente data in formato stringa "2011-29-01 12:00 am". Ora sto cercando di convertire il formato datetime con il seguente codice:Problema DateTime.TryParse con date del formato aaaa-gg-MM

DateTime.TryParse(dateTime, out dt); 

Ma sto ottenendo alwayws dt come {1/1/0001 12:00:00}, Può cortesemente dirmi perché? e come posso convertire quella stringa fino ad oggi.

EDIT: Ho appena visto tutti menzionati per utilizzare l'argomento formato. Ora citerò che non posso usare il parametro format perché ho alcune impostazioni per selezionare il dataformat personalizzato che l'utente vuole, e in base a tale utente è in grado di ottenere automaticamente la data nella casella di testo in quel formato tramite jQuery datepicker.

+3

Tra l'altro, è possibile determinare se la conversione non è riuscita controllando il valore di ritorno del 'TryParse'. Questo è 'bool success = DateTime.TryParse (...);'. –

risposta

131

Questo dovrebbe funzionare sulla base di esempio "2011-29-01 12:00"

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

Mi picchia. Se conosci il formato della stringa di input, dovresti utilizzare sempre i metodi TryParseExact/ParseExact. –

+0

ok, quindi il mio formato di data è simile a quello nell'esempio, ma se il valore del giorno o del mese è una cifra singola, il parser DateTime riporterà un errore, perché ha cercato due cifre quando ce n'era solo una. Cosa suggeriresti in questo scenario? –

+9

Per rispondere alla mia domanda, in questo caso se si utilizza un singolo carattere nel formato, esso funziona sia per le date di caratteri singoli sia per quelle doppie. ad es. d/m/yyyy funziona per il 13/11/2012 –

4

Da DateTime su MSDN:

Tipo: System.DateTime% Quando termina, questo metodo contiene il valore DateTime equivalente alla data e l'ora contenuta in s, se la conversione riuscito, o MinValue se la conversione ha avuto esito negativo. La conversione non riesce se il parametro s è nullo, è una stringa vuota (""), o non contiene una rappresentazione stringa valida di una data e un'ora. Questo parametro è passato non inizializzato.

Utilizzare invece parseexact con la stringa di formato "yyyy-dd-MM hh:mm tt".

+1

upvote per la mancata conversione valore restituito –

9

È necessario utilizzare ParseExact method. Questo richiede una stringa come secondo argomento che specifica il formato datetime è, per esempio:

// 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); 
} 

Se l'utente può specificare un formato nell'interfaccia utente, allora avete bisogno di tradurre che in una stringa si può passare in questo metodo. Puoi farlo sia consentendo all'utente di immettere direttamente la stringa di formato, anche se questo significa che la conversione ha più probabilità di fallire in quanto corrisponderà a immettendo una stringa di formato non valida o avendo una casella combinata che li presenta con le possibili scelte e tu imposti le stringhe di formato per queste scelte.

Se è probabile che l'ingresso non sarà corretto (input dell'utente, per esempio), sarebbe meglio usare TryParseExact piuttosto che le eccezioni per gestire il caso di errore:

// 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

che funziona:

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

Se si offre all'utente la possibilità di modificare il formato di data/ora, sarà necessario creare una stringa di formato corrispondente da utilizzare per l'analisi. Se si conoscono i possibili formati di data (ovvero l'utente deve selezionare da una lista), questo è molto più semplice perché è possibile creare tali stringhe di formato in fase di compilazione.

Se si consente all'utente di eseguire la progettazione in formato libero del formato data/ora, sarà necessario creare le stringhe di formato DateTime corrispondenti in fase di esecuzione.

+0

Questo è giusto jim Se lasci che l'utente faccia la progettazione in formato libero del formato data/ora, allora dovrai creare le stringhe di formato DateTime corrispondenti in fase di esecuzione. – Pinal

2

Provare a utilizzare sicuro metodo TryParseExact

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); 
Problemi correlati