.NET Wie kann man eine persische / farsi -Datumsstring (Jalali -Kalender) in ein DateTime -Objekt analysieren?

StackOverflow https://stackoverflow.com/questions/5811170

  •  25-10-2019
  •  | 
  •  

Frage

Ich habe mehrere großartige Code -Bibliotheken für die Konvertierung eines Persischen (Jalali -Kalenders) in ein gregorianisches Datum gelaufen. Meine ursprüngliche Quelle ist jedoch eine Zeichenfolge, kein DateTime -Objekt. Es scheint keine offizielle Unterstützung im .NET -Framework für die Parsendaten mit dem persischen Kalender zu geben (wenn ich falsch liege, zeig es mir bitte!).

Mein Ziel:

string persianDateString="1390/02/07";
DateTime persianDateTime = MyPersianParser.Parse(persianDateString, "yyyy/mm/dd");

Und natürlich können einige Daten für Monate und Tage der Woche Wortnamen verwenden, sodass ich das Standardformat -String -Protokoll unterstützen möchte.

Bearbeiten: Ich kenne die typische Funktionalität von DateTime.Parse. Der persische Kalender kann nicht verwendet werden, da Microsoft ihn unvollständig gelassen hat und/oder nicht repariert wird. Wenn jemand mich auf einen persischen Date -Parsen -Code verweisen kann, wäre ich dankbar. Wenn nicht, werde ich jemanden bitten, die Frage zu entfernen und sie einfach selbst zu schreiben.

War es hilfreich?

Lösung 2

Für die Parsen der Datumszeichenfolge verwende ich einfach den Standardkalender, um die Datumswerte (Jahr, Monat, Tag usw.) zu erhalten.

Ich benutze dann Diese Bibliothek hier Um die persischen Datumswerte in die gregorianischen Datumswerte umzuwandeln.

Mein Code sieht jetzt so aus:

string persianDate = "1390/02/07";
CultureInfo persianCulture = new CultureInfo("fa-IR");
DateTime persianDateTime = DateTime.ParseExact(persianDate, "yyyy/MM/dd", persianCulture);    // this parses the date as if it were Gregorian

JalaliCalendar jc = new JalaliCalendar();
// convert the Persian calendar date to Gregorian
DateTime gregorianDateTime = jc.ToDateTime(persianDateTime.Year, persianDateTime.Month, persianDateTime.Day, persianDateTime.Hour, persianDateTime.Minute, persianDateTime.Second, persianDateTime.Millisecond);

Natürlich muss ich mich um Datumskomponenten mit Namen (Monate, Wochentage) selbst kümmern, aber ich kann mich ziemlich leicht damit befassen.

Andere Tipps

Sie können immer das native System verwenden. Aber es ist ein bisschen schwierig.

Betrachten Sie diesen Code für die Konvertierung vom Jalali -Datum (hier 1387/03/18) in die Gregorianische DateTime:

System.Globalization.PersianCalendar persianCal = new System.Globalization.PersianCalendar();
    DateTime GregorianDate = persianCal.ToDateTime(1387, 3, 18, 12, 0, 0, 0);

und der folgende Code, um eine gregorianische DateTime (hier 1983/08/03) in die persische Datumszeichenfolge umzuwandeln:

DateTime GregorianDate = DateTime.Parse("1983/08/03");
string FarsiDateConverted = persianCal.GetYear(GregorianDate).ToString("0000") + "/" +
             persianCal.GetMonth(GregorianDate).ToString("00") + "/" +
             persianCal.GetDayOfMonth(GregorianDate).ToString("00");

Nur eine Notiz für den von @dan Bailiff bereitgestellten Link Ich sollte den Autor der Artikel des Artikels wiederholen:

"Der Hauptzweck für die Verwendung dieses Jalaicalendar anstelle des persischenkalendars von .NET Framework muss die Notwendigkeit eines Datumsgesprächs für historische Ereignisse sein. Wenn Sie nur das aktuelle Datum in Ihrer Website anzeigen möchten, reicht Persiancalendar aus."

Tatsächlich ist der Algorithmus des .NET -Frameworks für die Jahre 1178 bis 1634 Jalali (1799 bis 2256 Gregorian) korrekt

Aktualisieren:

Beginnend mit dem .NET Framework 4.6, Die persische Klasse verwendet den Hijri Solar -astronomischer Algorithmus anstelle eines Beobachtungsalgorithmus zur Berechnung von Daten. Dies im Einklang mit dem im Iran und in Afghanistan verwendeten persischen Kalender im Einsatz des persischen Kalenders, in dem sich der persische Kalender in den am weitesten verbreiteten Nutzung befindet. Wenn Sie also> 4.6 -Version von .NET Framework verwenden, benötigen Sie keine anderen Bibliotheken für die Konvertierung von Daten in/vom persischen Kalender.

Oder:

using System.Globalization;

CultureInfo MyCultureInfo = new CultureInfo("fa-IR");
      string MyString = "1390/02/07";
      DateTime MyDateTime = DateTime.Parse(MyString, MyCultureInfo);

Es gibt mehr Beispiel:http://msdn.microsoft.com/en-us/library/2h3syy57.aspx#y418

Probieren Sie es in ASP.NET MVC aus, um das persische Datum zu validieren

 [RegularExpression(@"^$|^([1۱][۰-۹ 0-9]{3}[/\/]([0 ۰][۱-۶ 1-6])[/\/]([0 ۰][۱-۹ 1-9]|[۱۲12][۰-۹ 0-9]|[3۳][01۰۱])|[1۱][۰-۹ 0-9]{3}[/\/]([۰0][۷-۹ 7-9]|[1۱][۰۱۲012])[/\/]([۰0][1-9 ۱-۹]|[12۱۲][0-9 ۰-۹]|(30|۳۰)))$", ErrorMessage = "Not Validate")]

Weitere Informationen zur Validierung des persischen Datums finden Sie in diesem Link

Ich

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top