Dot-Net

.NET 如何將波斯語/波斯語日期字元串(Jalali 日曆)解析為 DateTime 對象?

  • July 25, 2020

我遇到了幾個很棒的程式碼庫,用於將波斯(Jalali 日曆)日期轉換為公曆日期。但是,我的原始來源是一個字元串,而不是 DateTime 對象。.NET 框架中似乎沒有官方支持使用波斯日曆解析日期(如果我錯了,請告訴我!)。

我的目標:

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

當然,有些日期可能會使用單詞名稱來表示月份和星期幾,所以我希望能夠支持標準格式字元串協議。

編輯:我知道典型的 DateTime.Parse 功能。無法使用波斯日曆,因為 Microsoft 將其保留為不完整和/或不會修復它。如果有人能指出一些波斯日期解析程式碼,我將不勝感激。如果沒有,我會要求有人刪除問題並自己寫。

為了解析日期字元串,我只是使用預設日曆來獲取日期值(年、月、日等)

然後我在這裡使用這個庫將波斯日期值轉換為公曆日期值。

我的程式碼現在看起來像這樣:

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);

當然,我必須自己處理帶有名稱(月份、星期幾)的日期組件,但我可以很容易地處理它。

您始終可以使用本機 System.Globalization.PersianCalendar .NET 類。但這有點棘手。

考慮將這段程式碼從 Jalali Date(此處為 1387/03/18)轉換為 Gregorian DateTime:

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

以及將公曆日期時間(此處為 1983/08/03)轉換為波斯日期字元串的以下程式碼:

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

只是@Dan Bailiff 提供的連結的註釋我應該重複文章作者的話:

“使用這個 JalaiCalendar 代替 .NET Framework 的 PersianCalendar 的主要目的必須是需要對歷史事件進行日期對話。如果您只想在您的網站中顯示目前日期,PersianCalendar 就足夠了。”

事實上 .NET Framework 的算法對於 1178 年到 1634 年 Jalali(1799 到 2256 公曆)是正確的

更新:

從 .NET Framework 4.6 開始,PersianCalendar 類使用回曆太陽天文算法而不是觀測算法來計算日期。這使得 PersianCalendar 實現與伊朗和阿富汗使用的波斯歷保持一致,這兩個國家使用波斯歷最廣泛。因此,如果您使用 >4.6 版本的 .NET Framework,則不需要任何其他庫來將日期與波斯日曆相互轉換。

引用自:https://stackoverflow.com/questions/5811170