.NET Как разобрать строку даты персидского / фарси (календарь Джалали) в объект DateTime? - PullRequest
12 голосов
/ 28 апреля 2011

Я наткнулся на несколько великолепных библиотек кода для преобразования персидской даты (календаря Джалали) в григорианскую дату. Тем не менее, мой исходный источник - это строка, а не объект DateTime. Кажется, в .NET Framework нет официальной поддержки для разбора дат с использованием персидского календаря (если я ошибаюсь, покажите мне!).

Моя цель:

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

И, конечно, некоторые даты могут использовать имена слов для месяцев и дней недели, поэтому я хотел бы иметь возможность поддерживать стандартный формат строкового протокола.

РЕДАКТИРОВАТЬ: я знаю о типичной функциональности DateTime.Parse. Персидский календарь нельзя использовать, потому что Microsoft оставила его неполным и / или не исправит. Если кто-нибудь может указать мне какой-нибудь персидский код для разбора даты, я был бы благодарен. Если нет, я попрошу кого-нибудь удалить вопрос и просто написать его самому.

Ответы [ 4 ]

12 голосов
/ 27 июля 2011

Вы всегда можете использовать собственный класс System.Globalization.PersianCalendar .NET. но это немного сложно.

Рассмотрим этот код для преобразования даты Джалали (здесь 1387/03/18) в григорианскую дату:

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 вместо PersianCalendar .NET Framework должна заключаться в необходимости обсуждения даты для исторических событий. Если вы просто хотите отобразить текущую дату на своем сайте, достаточно PersianCalendar»

Фактически алгоритм .NET Framework корректен для Джалали с 1178 по 1634 годы (по григорианскому языку с 1799 по 2256)

Обновление:

Начиная с .NET Framework 4.6 , класс PersianCalendar использует солнечный астрономический алгоритм Hijri , а не алгоритм наблюдения для вычисления дат. Это делает реализацию PersianCalendar согласованной с персидским календарем, используемым в Иране и Афганистане, двух странах, в которых персидский календарь используется наиболее широко. Так что если вы используете версию .NET Framework> 4.6, вам не нужны никакие другие библиотеки для преобразования дат в / из персидского календаря.

3 голосов
/ 28 апреля 2011

Для разбора строки даты я просто использую календарь по умолчанию, чтобы получить значения даты (год, месяц, день и т. Д.)

Затем я использую эту библиотеку для преобразованияПерсидские значения даты в григорианские значения даты.

Мой код теперь выглядит так:

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

Конечно, мне придется позаботиться о компонентах даты с именами (месяцамидней недели), но я могу справиться с этим довольно легко.

2 голосов
/ 28 апреля 2011

Или:

using System.Globalization;

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

Есть еще пример: http://msdn.microsoft.com/en-us/library/2h3syy57.aspx#Y418

0 голосов
/ 24 июля 2017

попробуйте в ASP.NET MVC для проверки персидской даты

 [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")]

для получения дополнительной информации о валидации персидской даты перейдите по этой ссылке

اعتبارسنجی تاریخ شمسی با Регулярное выражение

...