wake-up-neo.com

DateTime.ToString ("MM / tt / jjjj HH: mm: ss.fff") ergab so etwas wie "14.09.2013 07.20.31.371"

Ich habe eine WP8-App, die die aktuelle Uhrzeit an einen Webservice sendet.

Ich erhalte die Datums-/Uhrzeitzeichenfolge durch Aufrufen

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff")

Für die meisten Benutzer funktioniert es hervorragend und gibt mir den richtigen String wie "09/10/2013 04:04:31.415". Aber für einige Benutzer ist die resultierende Zeichenfolge so etwas wie "09/14/2013 07.20.31.371", was Probleme in meinem Webdienst verursacht.

Liegt es an irgendwelchen Kulturformatproblemen? Wie kann ich sicherstellen, dass die Ergebniszeichenfolge durch einen Doppelpunkt anstelle eines Punkts begrenzt wird?

123
Eldorado

Liegt es an einem Kulturformatproblem?

Ja. Ihr Benutzer muss sich in einer Kultur befinden, in der das Zeittrennzeichen ein Punkt ist. Sowohl ":" als auch "/" werden kulturabhängig in benutzerdefinierte Datums- und Zeitformate interpretiert.

Wie kann ich sicherstellen, dass die Ergebniszeichenfolge durch einen Doppelpunkt anstelle eines Punkts begrenzt wird?

Ich würde vorschlagen, CultureInfo.InvariantCulture anzugeben:

string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff",
                                CultureInfo.InvariantCulture);

Alternativ können Sie auch die Zeit- und Datumstrennzeichen angeben :

string text = dateTime.ToString("MM'/'dd'/'yyyy HH':'mm':'ss.fff");

... aber das gibt Ihnen "interessante" Ergebnisse, die Sie wahrscheinlich nicht erwarten, wenn Sie Benutzer in einer Kultur zum Laufen bringen, in der das Standardkalendersystem nicht der Gregorianische Kalender ist. Nehmen Sie zum Beispiel den folgenden Code:

using System;
using System.Globalization;
using System.Threading;

class Test
{
    static void Main()        
    {
        DateTime now = DateTime.Now;
        CultureInfo culture = new CultureInfo("ar-SA"); // Saudi Arabia
        Thread.CurrentThread.CurrentCulture = culture;
        Console.WriteLine(now.ToString("yyyy-MM-ddTHH:mm:ss.fff"));
    }
} 

Das ergibt eine Ausgabe (am 18. September 2013) von:

11/12/1434 15:04:31.750

Ich vermute, dass Ihr Web-Service davon überrascht wäre!

Eigentlich würde ich vorschlagen, nicht nur die invariante Kultur zu verwenden, sondern auch auf ein ISO-8601-Datumsformat umzustellen:

string text = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");

Dies ist ein global akzeptiertes Format - es ist auch sortierbar und macht die Reihenfolge von Monat und Tag deutlich. (In der Erwägung, dass der 07.06.2013 je nach Leserkultur als 7. Juni oder 6. Juli interpretiert werden könnte.)

229
Jon Skeet

: hat eine besondere Bedeutung: Es ist das Zeittrennzeichen. ( benutzerdefinierte Datums- und Zeitformat-Zeichenfolgen ).

Verwenden Sie \, um es zu entkommen:

DateTime.ToString(@"MM/dd/yyyy HH\:mm\:ss.fff")

Oder benutze CultureInfo.InvariantCulture:

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture)

Ich würde vorschlagen, mit dem zweiten zu beginnen, da / ebenfalls eine besondere Bedeutung hat (es ist das Datumstrennzeichen. ), also können Sie habe auch damit probleme.

9
MarcinJuraszek

Sie können InvariantCulture verwenden, da sich Ihr Benutzer in einer Kultur befinden muss, in der anstelle eines Doppelpunkts ein Punkt verwendet wird:

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture);
7
Jon La Marr

Ich bin in letzter Zeit mit Windows 10 von eine andere Richtung auf dieses Problem gestoßen und fand die Antwort von @JonSkeet sehr hilfreich bei der Lösung meines Problems.

Ich habe auch weitere Nachforschungen mit einem Testformular angestellt und festgestellt, dass, wenn die aktuelle Kultur zur Laufzeit auf _"no"_ oder _"nb-NO"_ gesetzt wurde (Thread.CurrentThread.CurrentCulture = new CultureInfo("no");), der ToString ("yyyy-MM-dd HH: mm : ss ") hat in Windows 7 und Windows 10 unterschiedlich reagiert. Es wurde das zurückgegeben, was ich in Windows 7 und HH.mm.ss in Windows 10 erwartet hatte!

Ich finde das ein bisschen gruselig! Seit ich geglaubt habe, dass eine Kultur zumindest in jeder Windows-Version eine Kultur ist.

6

Sie können String.Format verwenden:

DateTime d = DateTime.Now;
string str = String.Format("{0:00}/{1:00}/{2:0000} {3:00}:{4:00}:{5:00}.{6:000}", d.Month, d.Day, d.Year, d.Hour, d.Minute, d.Second, d.Millisecond);
// I got this result: "02/23/2015 16:42:38.234"
4
Cosmin

Datum in Zeichenfolge konvertieren

Verwenden Sie den Namen Space

using System.Globalization;

Code

string date = DateTime.ParseExact(datetext.Text, "dd-MM-yyyy", CultureInfo.InstalledUICulture).ToString("yyyy-MM-dd");
0
Hafsal