8 Stimmen

String.FormatException mit DateTime in einer Nicht-US-Kultur

Ich erhalte eine String.FormatException, die versucht, eine Zeichenfolge zu konvertieren/parsen, wenn die Kultur anders als nicht-US ist. Das Seltsame ist, dass die Zeichenfolge war generiert durch die Anwendung des gleichen Formats und der gleichen Kultur, die für die Umwandlung in eine Zeichenkette verwendet werden. In dem nachstehenden Code schlagen alle diese Versionen fehl:

const string culture = "ja-JP";
const string format = "dd MMM yyyy"; //error in orignal post included {0:}

CultureInfo info = new CultureInfo(culture);
Thread.CurrentThread.CurrentCulture = info;
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(culture);

//string toParse = String.Format(info, format, DateTime.Now); //error in original post
string toParse = DateTime.Now.ToString(format);
System.Diagnostics.Debug.WriteLine(string.Format("Culture format = {0}, Date = {1}", culture, toParse));
try
{
    DateTime output = DateTime.ParseExact(toParse, format, CultureInfo.InvariantCulture);
    //DateTime output = DateTime.ParseExact(toParse, format, info);
    //DateTime output = DateTime.ParseExact(toParse, format, info, DateTimeStyles.None);
    //DateTime output = Convert.ToDateTime(toParse, info);
}
catch (Exception ex)
{
    System.Diagnostics.Debug.WriteLine(ex.Message);
}

Die Zeichenfolge für en-US es "25 Feb 2010" .
Die Zeichenfolge für ja-JP es "25 2 2010" .

Haben Sie eine Idee, wie man den "25. 2. 2010" wieder in ein Datum umwandeln kann?

Vielen Dank im Voraus.

Bearbeiten 1 : Ich sollte anmerken, dass die japanische Kultur hier nur als Beispiel fest einkodiert ist. Ich brauche dies wirklich mit was auch immer Kultur durch den Benutzer eingestellt wird zu arbeiten. Was ich brauche, ist eine Lösung, bei der das Datums-/Zeitformat unabhängig von der Kultur des Benutzers funktioniert. Ich denke, das einzelne M reicht aus.

Bearbeiten 2 : M funktioniert nicht für Englisch. Kennt jemand eine Formatzeichenfolge, die für alle Kulturen funktioniert?

3voto

João Angelo Punkte 54226

Wenn Sie sich ändern:

DateTime output = DateTime.ParseExact(
    toParse, format, CultureInfo.InvariantCulture);

zu

DateTime output = DateTime.ParseExact(toParse, "dd MMM yyyy", info);

wird das Datum korrekt geparst.

Beachten Sie, dass Sie in Ihrem Beispiel eine Kultur (ja-JP) für die Konvertierung in eine Zeichenkette und eine andere Kultur für die Konvertierung aus einer Zeichenkette verwenden. Ein weiteres Problem ist, dass String.Format akzeptiert eine zusammengesetzte Formatzeichenkette ( "My string to format - {0:dd MMM yyyy}" ), sondern DateTime.ParseExact erwartet nur das Datumszeitformat.

0voto

tvanfosson Punkte 506878

Versuchen Sie, beim Parsen des Datums ein einzelnes M zu verwenden. Dies wird in dem Beispiel für das MonthDayPattern für die japanische Kultur.

const string format = "{0:dd M yyyy}";

0voto

šljaker Punkte 7214
string text = "25 2 2009";
DateTime date = DateTime.ParseExact(text, "d M yyyy", CultureInfo.InvariantCulture);

0voto

Samuel Neff Punkte 70231

Das Formatmuster, das Sie an DateTime.ParseExact muss nur das Datumsmuster sein, ohne den Platzhalter. Und für JP culture müssen Sie nur ein M da die Daten durch Zahlen dargestellt werden, auch wenn MMM bei der Konvertierung in eine Zeichenkette angegeben wird.

const string culture = "ja-JP";
const string FROM_STRING_FORMAT = "dd M yyyy";
const string TO_STRING_FORMAT = "{0:" + FROM_STRING_FORMAT + "}";
CultureInfo info = new CultureInfo(culture);
Thread.CurrentThread.CurrentCulture = info;
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(culture);

string toParse = String.Format(info, TO_STRING_FORMAT, DateTime.Now);
Console.WriteLine(string.Format("Culture format = {0}, Date = {1}", culture, toParse));
try
{
    DateTime output = DateTime.ParseExact(toParse, FROM_STRING_FORMAT, CultureInfo.InvariantCulture);
    Console.WriteLine(output);
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X