2013-04-29 3 views
5

Ich benutze einen Webservice, der mir einige Daten als String zurückgibt, und ich benutze DateTime.Parse, um die entsprechenden DateTime Objekte zu erhalten. Es funktioniert, aber ich fürchte, meine Verwendung von DateTime.Parse kann anfällig für Fehler sein, die durch unterschiedliche Gebietsschemaeinstellungen verursacht werden. Das Datum zurückgegeben wird, ist in folgendem Format:Wie man eine DateTime in diesem Format korrekt analysiert: "2013-04-29T00: 00: 00"

2014-04-24T00:00:00 

Der Code, den ich es zu analysieren, verwenden:

DateTime d = DateTime.Parse(strValue); 

Gibt es irgendeine Art und Weise (wie ein Format Provider vorbei, oder mit einer anderen Methode), in dem Ich garantiere, dass meine Parsing-Routine unabhängig von den Maschineneinstellungen funktioniert.

+2

Dies ist das ISO8601-Datumsformat, das * nicht * abhängig von den Maschineneinstellungen ändert. Die Weitergabe von Kultur würde nicht schaden, sondern optional sein. –

+0

Beachten Sie auch, dass das Ergebnis eines dieser Elemente einen '.Kind'-Wert von' Nicht angegeben 'hat - was möglicherweise nicht das ist, was Sie erwartet haben. –

Antwort

5

Wenn Sie ein Datum unabhängig von der Benutzer-Gebietsschema analysieren wollen, dann verwenden Sie die invariant culture:

DateTime d = DateTime.Parse(strValue, CultureInfo.InvariantCulture); 
+0

Ja, Ihre Antwort wird funktionieren, aber es wird mit jeder Kultur funktionieren. –

+0

@MartinMulder Es ist nicht klar, was du meinst. Dieser Code verhält sich im Kontext jeder Kultur genauso: Er analysiert die Zahlen entsprechend der invarianten Kultur und ignoriert die Kulturregeln für den aktuellen Kontext. Dies scheint das zu sein, was das OP wünscht. – cdhowie

+0

Ja, aber das ist mehr als er will. Schau dir meine Antwort an. Es spielt keine Rolle, welche Kultur er benutzt (en-US, nl-NL, Invaruant, etc.). Das Format, das er verwendet, wird IMMER richtig analysiert, so dass Sie keine Kultur explizit bereitstellen müssen. –

1

Da Sie eine genaue Format haben, würde ich ein nicht-mehrdeutig Format-String verwenden:

DateTime.ParseExact("2014-04-24T00:00:00", "yyyy\\-MM\\-dd\\THH\\:mm\\:ss", null) 
// or to reduce the C#-escaped backslashes: 
DateTime.ParseExact("2014-04-24T00:00:00", @"yyyy\-MM\-dd\THH\:mm\:ss", null) 

Die ausgeblendeten Bindestriche und Doppelpunkte sowie die ausgeblendeten T bedeuten, dass dies konstante Werte sind. Diese Zeile sollte also unabhängig von anderen Faktoren funktionieren.

+0

Eine große Lösung während "s" wäre viel kürzer gewesen! –

+1

Wenn "s" für Sie arbeitet, gehen Sie dafür. Ich bin jedoch der Meinung, dass die Klarheit der Schreibweise für jeden nützlich ist, der Ihren Code oder die Fehlerbehebung in der Zukunft liest. Es beseitigt Unklarheiten und basiert nicht auf integrierten Standards - es funktioniert einfach und wird nie funktionieren, und Sie müssen sich nie die Dokumentation ansehen, um herauszufinden, warum es funktioniert oder nicht. –

0
string dateString; 
    DateTime dateValue; 

    // Parse a string. 
    dateString = "2014-04-24T00:00:00"; 
    if (DateTime.TryParseExact(dateString, "o", CultureInfo.InvariantCulture, 
       DateTimeStyles.None, out dateValue)) 
    Console.WriteLine("Converted '{0}' to {1} ({2}).", dateString, dateValue, 
      dateValue.Kind); 
+0

Dies wird fehlschlagen, weil das "o" -Format sieben Dezimalstellen von Sekundenbruchteilen erfordert. –

1

Ja, könnten Sie die Verwendung DateTime.ParseExact

string dateString, format; 
DateTime result; 
CultureInfo provider = CultureInfo.InvariantCulture; 

dateString = "2013-04-29T00:00:00"; 
format = "s"; 

result = DateTime.ParseExact(dateString, format, provider); 

Die Zeichenfolge "s" entspricht einer sortierbaren DateTime (MSDN unter Format Strings)

Verwandte Themen