2016-07-19 15 views
1

Sprache: C#, NET Framework: 4.5, Methode verwendet: DateTime.ParseExactString wurde nicht als gültige Datetime auf einem PC erkannt

So in einem unserer Projekte verwenden wir

private DateTime FormatDate(string date, string format) 
{ 
    try 
    { 
     IFormatProvider culture = new CultureInfo("en-US", true); 
     DateTime dt = DateTime.ParseExact(date, format, culture); 
     return dt; 
    } 
    catch (Exception ex) 
    { 
     throw new Exception(ex.Message); 
    } 
} 

und nannte es wie folgt aus::

DateTime startDate = FormatDate("01/17/2016", "M/d/yyyy"); 
die folgende Funktion eine Zeichenfolge in ein Datetime zu analysieren

Auf unseren 3 PCs funktioniert dieser Code perfekt, wenn das Datumsformat auf jedem PC TT/MM/JJJJ ist, aber auf 2 der PCs, wenn das Datumsformat dd-MMM-yy ist, erzeugt es einen Fehler beim Ausführen von ParseExact :

String wurde nicht als gültige DateTime erkannt.

Während es auf dem dritten PC funktioniert, auch wenn Sie das Format dd-MMM-yy verwenden. I verglichen Datum und Uhrzeit-Einstellungen auf alle 3 PCs, sind alle Einstellungen gleich, der einzige Unterschied besteht darin, dass auf dem 2 PC wir Visual Studio 2013, während auf dem dritten Visual Studio 2015

Ausnahmedetails verwenden:

Nachricht: String wurde nicht als gültige DateTime erkannt.

Innerexception: Nein Interne Ausnahme

Stack: bei System.DateTime.ParseExact (String s, String-Format, IFormatProvider Provider) bei AssetTracking.PopUpWindows.AddItem_Warranty.MakeReminder (TrackersDataContext nach OT, Artikel ni, string itemId) in d: \ Lösungen \ Trackers \ Trackers \ PopUpWindows \ AddItem_Warranty.xaml.cs: Zeile 807 bei Trackers.PopUpWindows.AddItem_Warranty. <> c__DisplayClass8.b__3() in d: \ Lösungen Tacker \ Trackers \ \ PopUpWindows \ AddItem_Warranty.xaml.cs: Linie 685

Die Frage: Ich bin nicht sicher, ist der andere IDE Teil der Problem? oder was sonst kann diesen Fehler auf einigen PCs und nicht auf anderen genau die gleichen Datum und Zeit Einstellungen erzeugen?

+0

Die IDE, die Sie verwenden, sollte keinen Einfluss auf die Anweisungen haben, die Ihr Code auch kompiliert.Ich würde denken, dass es etwas anderes wie Kultureinstellungen wäre http://stackoverflow.com/questions/27230972/datetime-parse-works-on-one-machin-but-not-the-other – Kritner

+2

Können Sie die Ausgaben von 'vergleichen DateTimeFormatInfo.GetInstance (neue CultureInfo ("en-US", true)). GetAllDateTimePatterns() 'auf jeder Maschine? Diese Muster werden in 'DateTime.ParseX()' Methoden versucht –

+0

Sind Sie sicher, dass die Datumszeichenfolge immer mit dem Trennzeichen übergeben wird, das Ihrem Format entspricht? – Steve

Antwort

0

Erste Sache ist, Ihre Ausnahmebehandlung gebrochen:

private DateTime FormatDate(string date, string format) 
{ 
    try 
    { 
     IFormatProvider culture = new CultureInfo("en-US", true); 
     return DateTime.ParseExact(date, format, culture); 
    } 
    catch (Exception ex) 
    { 
     throw new Exception(ex.Message); 
    } 
} 

Es gibt nichts in dem catch-Block durchgeführt, so bricht es nur die Stacktrace. Entfernen Sie alles:

private DateTime FormatDate(string date, string format) 
{ 
    IFormatProvider culture = new CultureInfo("en-US", true); 
    return DateTime.ParseExact(date, format, culture); 
} 

Zweiter Punkt ist, den Wert, den Sie bereitgestellt eigentlich nicht das Muster passen dd-MMM-yy Sie angegeben. Offensichtlich löst die DateTime.ParseExact Funktion eine entsprechende Ausnahme aus. Hier ist ein Beispiel von gültigen Eingabewert:

var startDate = FormatDate("11-Mar-16", "dd-MMM-yy"); 

Entfernen Sie die zusätzliche M, wenn Sie den Monat als Zahl gemeint.

+0

, aber der ParseExact sollte nicht in der Lage sein, irgendeine annehmbare Datumszeichenkette zu nehmen und sie in irgendein Datumsformat zu formatieren, das im zweiten Parameter übergeben wird? ohne vom Format der Maschine betroffen zu sein, in der es ausgeführt wird? – Saleem

+0

und wenn ja, warum wirft es dann keine Ausnahme auf die anderen 2 PCs mit den gleichen Datums- und Zeitformaten wie die dritte ?! – Saleem

+2

@Saleem Was 'ParseExact' tut, ist, dass es versucht, eine gültige' DateTime' für den sehr spezifischen Eingabewert und das sehr spezifische Format, das Sie angegeben haben, zurückzugeben. Wenn beide nicht übereinstimmen, wird es fehlschlagen. Verwenden Sie 'Parse ', wenn Sie nicht erwarten, dass der Eingabewert für _exactly_ dem angegebenen Muster entspricht. – ken2k

Verwandte Themen