2016-06-27 28 views
1

Ich bin mir nicht sicher, ob das Problem, das ich habe, wegen eines Mangels an Verständnis dafür ist, wie die Datetime-Arbeit im Umm al-Qura-Kalender funktioniert oder ob es ein Bug ist.Arabische Kultur datetime Parsing gibt keine erwarteten Werte zurück

Im Grunde arbeite ich daran, einen Test zu schreiben, um sicherzustellen, dass eine interne Dienstprogrammklasse unabhängig von der aktuellen Kultur Werte analysiert.

Im folgenden Code ist es das Ziel DT1 gleich dt2 zu haben.

public void ArabicTesting() 
    { 
     CultureInfo culture = new CultureInfo("ar"); 

     // Initialize a new datetime (04/01/2048 06:21:01 AM) 
     DateTime dt1 = new DateTime(2048, 4, 1, 6, 21, 1); 

     // Convert the datetime to a string using arabic cultureinfo 
     // string ends up being "17/06/70 06:21:01 ص," 
     string dt2_string = $"{dt1.ToString(culture.DateTimeFormat.ShortDatePattern)} {dt1.ToString(culture.DateTimeFormat.LongTimePattern)}"; 

     // Parse the string 
     DateTime dt2; 
     DateTime.TryParse(dt2_string, culture, DateTimeStyles.None, out dt2); 
    } 

Das Problem ist, dass DateTime.TryParse wird die Datetime als String in ein Datetime-Parsing, die die gleiche erscheint, hat aber andere Werte als das, was erwartet wird.

Hier sind ein paar Screenshots von dem, was geschieht:

dt1 dt2

Wenn Sie beide sehen DT1 und dt2 Vorschauwerte, erscheinen sie die gleiche „17/06/70 06:21:01 ص, "jedoch sind die tatsächlichen Werte der Objekte völlig verschieden.

Weiß jemand, ob dies ein MS-Fehler ist, oder liegt es daran, dass ich nicht den richtigen String-Wert in die DateTime.TryParse Methode übertrage?

+1

Was passiert, wenn Sie ein 'LongDatePattern' anstatt eines' ShortDatePattern' verwenden? 'string dt2_string = $" {dt1.ToString (culture.DateTimeFormat.LongDatePattern)} {dt1.ToString (culture.DateTimeFormat.LongTimePattern)} ";' – Igor

+0

@Igor, das für dieses Szenario funktioniert hat - danke. Ich bin immer noch etwas besorgt, es scheint mir ein Problem zu sein, dass die Standard-ToString-Methode einer DateTime identische Werte für verschiedene Daten zurückgibt. Es sollte nicht Standard sein, ein kurzes Datumsmuster in arabischen Kulturen zu verwenden, wenn das passieren kann? – user2338408

Antwort

1

Um sicherzustellen, dass das vollständige Datum erfasst wird, versuchen Sie es mit LongDatePattern anstelle von ShortDatePattern.

string dt2_string = $"{dt1.ToString(culture.DateTimeFormat.LongDatePattern)} {dt1.ToString(culture.DateTimeFormat.LongTimePattern)}"; 

Die Ergebnisse der 2 könnten auf dieser Basis anders sein als die ShortDatePattern einen Datumsteil weglassen könnte, die dann einen Standardwert in der Parse-Methode, wie das Gesamtjahr (Beispiel) angenommen werden, zu Unrecht haben könnten. Welcher Teil davon angenommen wird oder nicht, hängt von der verwendeten Kultur ab, und einige Kulturen arbeiten wahrscheinlich so oder so, während andere Probleme haben (wie Arabisch).

Um besser zu verstehen, warum dies in diesem speziellen Fall passiert, können Sie die 2 Zeichenfolgen von dt1.ToString(culture.DateTimeFormat.LongDatePattern) und dt1.ToString(culture.DateTimeFormat.ShortDatePattern) vergleichen und sehen, welcher Teil des Datums durch einen Standardwert aus dem aktuellen Datum/Uhrzeit zur Laufzeit ersetzt werden könnte.

+0

Es scheint kontraintuitiv, dass es ein Muster für das Schreiben von Daten gibt, die sich auf mehr als ein Datum beziehen können, obwohl ich denke, dass auch solche in der englischen Kultur existieren (z. B. 06/27/16) In diesem Fall Ich kann leicht sehen, warum dieses Problem jetzt passiert. Es ist definitiv gut zu wissen, also danke, dass du dabei geholfen hast! – user2338408

Verwandte Themen