2015-05-04 7 views
7

Scope:DateTime.TryParseExact arbeitet nur in „One Way“

Ich habe versucht, eine super-tolerant DateTime.Parse Routine zu entwickeln, so entschied ich mich am meisten zu geben „weit verbreiteten“ formatiert einen Versuch besser verstehe die format masks.

Problem:

ich ein bestimmtes Format festgelegt haben (String), die ich als myDate.ToString(format) verwenden, und es wirkt Wunder. Das Problem ist, wenn ich die gleiche Zeichenfolge (Ergebnis der Operation .ToString(format)) bekomme und es zurück an DateTime.TryParseExact (...) füttere, schlägt es fehl.

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

Ausgang ist: "Failed to Parse Date".

Frage:

Warum kann ich die format Zeichenfolge verwenden, um ein bestimmtes Datum als Text zu formatieren, aber ich kann nicht denselben format verwenden, um die Zeichenfolge an ein Datumsobjekt zurückzugeben?

EDIT:

Ich habe einen Teil meiner Methode this example hinzugefügt, und ich möchte wissen, warum der „ParseDate“ -Methode ein richtiges Datum zurückzubringen, nicht gegeben, dass der „String“ in der ist richtiges Format.

+2

Was ist Ihre 'CurrentCulture'? –

+2

Versuchen Sie 'string dtNow = DateTime.Now.ToString (Format, Provider);' Fügen Sie die Kultur hinzu, wenn Sie in eine Zeichenkette konvertieren. –

+1

Bestätigt, dass es mit 'pt-BR' (Portugiesisch (Brasilien)) fehlschlägt. –

Antwort

5

Da Sie DateTime.ToString() Methode ohne IFormatProvider verwenden, verwendet diese Methode Ihre CurrentCulture Einstellungen.

Das ist, warum Ihre

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

Linie könnte eine andere String-Darstellung erzeugen als MM/dd/yyyy HH:mm:ss tt Format.

Drei Dinge können dieses Problem verursachen;

  • Ihre CurrentCulture hat eine andere als /
  • Ihre CurrentCulture hat eine andere TimeSeparator als :
  • Ihre CurrentCulture hat eine andere oder eine leere Zeichenfolge als AMDesignator und/oder PMDesignator

Seit Sie versuchen, Ihre Zeichenfolge mit provider (InvariantCulture) zu analysieren Ihre DateTime.TryParseExact Methode, generieren Sie Ihre Zeichenfolge basierend auf diesem Anbieter.

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

Sie Ihrer erzählt CurrentCulturept-BR ist und diese Kultur hat leere Zeichenkette "" als AMDesignator und PMDesignator.Deshalb hat Ihr dtNow String keinen AM- oder PM-Bezeichner auf seinem Darstellungsteil.

Hier ein demonstration.

+0

Sollte nicht die erste Zeile meines Codes, das beheben? (CultureInfo.InvariantCulture) –

+0

@MarcelloGrechiLins Wenn Sie es in Ihrer 'DateTime.Now.ToString()' Methode als zweiten Parameter verwenden, ja, wird es behoben. –

+0

Ich habe meine Frage mit einem anderen Beispiel aktualisiert. Was ich nicht verstehe, ist, warum es nicht funktioniert, wenn man von einem "String" analysiert. Es gibt kein Datum hier, nichts, nur einen "String" in dem richtigen Format, das durch die "TryParseExact" -Methode spezifiziert wird. –