DateTime.ToString() und CurrentCulture – ein gern gemachter Fehler

Michael Schwarz on Tuesday, September 22, 2009

Ich habe einen NT Dienst, den ich über eine COM Schnittstelle ansprechen kann. Als Datenformat wird das vom System genommen, also das, was wir in Region und Sprach in der Systemsteuerung festlegen. Der NT Dienst als auch meine .NET Anwendung übertragen ein Datum dann beispielsweise wie folgt:

<root>     
  <view>order</view>      
  <filter type="date">20.04.2009</filter>      
  <filter type="time">09:00</filter>      
</root>

Im C# Source Code wird dafür die ToString-Methode einer DateTime Instanz aufgerufen, als Parameter steht dort auf einem Deutschen System HH:mm.

Nun habe ich mal die Sprache (CurrentCulture) auf Italienisch gesetzt, und prompt geht die Abfrage in die Hose. Warum eigentlich?

Thread.CurrentThread.CurrentCulture = new CultureInfo("it");      
Thread.CurrentThread.CurrentUICulture = new CultureInfo("it");

DateTime dt = new DateTime(2009, 4, 20, 9, 0, 0);     
Console.WriteLine(dt.ToString("HH:mm"));    // erwartet: 09:00

Hat man die CurrentCulture auf Italienisch gesetzt, erzeugt der obige Source Code eine auf den ersten Blick nicht nachvollziehbare Ausgabe:

09.00 anstatt 09:00

Der Haken ist, dass die ToString-Methode eben immer die Platzhalter durch die sprachabhängigen Zeichen ersetzt. Im Italienischen verwendet man eben den Punkt als Trennzeichen zwischen Stunde und Minute.

Um nun die Ausgabe richtig zu machen, verwendet man einfach noch das zweite Argument:

Console.WriteLine(dt.ToString("HH:mm", **DateTimeFormatInfo.InvariantInfo**));

Damit klappt’s dann auch mit der richtigen Ausgabe. Übrigens funktioniert das natürlich auch bei den anderen sprachabhängigen Formatierungen (z.B. Komma bei System.Double, dort verwendet man dann NumberFormatInfo.InvariantInfo).

Wieder etwas gelernt, an das ich mich beim nächsten Mal wieder nicht erinnere.