2015-05-04 7 views
7

Ambito:DateTime.TryParseExact lavorare solo in "One Way"

ho cercato di sviluppare una routine di DateTime.Parse super-tolerant, così ho deciso di dare più "ampiamente usato" formatta una prova per meglio capire il format masks.

Problema:

Ho definito un formato specifico (String) che uso come myDate.ToString(format), e funziona a meraviglia. Il problema è che se ottengo lo stesso String (risultato dell'operazione .ToString(format)) e lo restituisco a DateTime.TryParseExact (...) non riesce.

Codice/Test:

System.Globalization.CultureInfo provider = System.Globalization.CultureInfo.InvariantCulture; 

// Defining Format and Testing it via "DateTime.ToString(format)" 
string format = "MM/dd/yyyy HH:mm:ss tt"; 
string dtNow = DateTime.Now.ToString (format); 
Console.WriteLine (dtNow); 

// Trying to Parse DateTime on the same Format defined Above 
DateTime time; 
if (DateTime.TryParseExact (dtNow, format, provider, System.Globalization.DateTimeStyles.None, out time)) 
{ 
    // If TryParseExact Worked 
    Console.WriteLine ("Result: " + time.ToString()); 
} 
else 
{ 
    // If TryParseExact Failed 
    Console.WriteLine ("Failed to Parse Date"); 
} 

uscita è: "Failed to Parse Date".

Domanda:

Perché è possibile utilizzare la stringa format per formattare una certa data come testo, ma io non è possibile utilizzare lo stesso format per riportare la stringa su un oggetto data?

EDIT:

ho aggiunto parte del mio metodo per this example, e vorrei sapere perché il metodo "parsedate" non riesce a restituire una data appropriata, dato che la "stringa" è nella giusto formato.

+2

Qual è il tuo 'CurrentCulture'? –

+2

Prova 'string dtNow = DateTime.Now.ToString (formato, provider);' Aggiungi la cultura durante la conversione in stringa. –

+1

Confermato che fallisce con 'pt-BR' (portoghese (Brasile)). –

risposta

5

Poiché si utilizza il metodo DateTime.ToString() senza alcun IFormatProvider, questo metodo utilizzerà le impostazioni CurrentCulture.

Ecco perché il vostro

string dtNow = DateTime.Now.ToString (format); 

linea potrebbe generare una rappresentazione stringa di diverso rispetto al formato MM/dd/yyyy HH:mm:ss tt.

Tre cose possono causare questo problema;

  • tuo CurrentCulture ha un diverso rispetto /
  • tuo CurrentCulture ha una diversa TimeSeparator rispetto :
  • tuo CurrentCulture ha una stringa differente o vuoto come AMDesignator e/o PMDesignator

Da si tenta di analizzare la stringa con provider (che è InvariantCulture) su il tuo metodo DateTime.TryParseExact, genera anche la tua stringa basata su quel provider.

string dtNow = DateTime.Now.ToString(format, provider); 

ti ha detto il tuo CurrentCulture è pt-BR e questa cultura ha stringa vuota "" come AMDesignator e PMDesignator.Ecco perché la tua stringa dtNow non avrà alcun designatore AM o PM sulla sua parte di rappresentazione.

Qui a demonstration.

+0

Non dovrebbe la prima linea del mio codice, risolvere questo? (CultureInfo.InvariantCulture) –

+0

@MarcelloGrechiLins Se lo si utilizza nel metodo 'DateTime.Now.ToString()' come secondo parametro, sì, lo risolverà. –

+0

Ho aggiornato la mia domanda con un altro esempio. Quello che non capisco è, perché non funziona quando si analizza da una "stringa". Non c'è una data qui, niente di niente, solo una "stringa" nel formato corretto specificato dal metodo "TryParseExact". –