Подтвердить что ты не робот

.NET. Как проанализировать строку даты персидского/фарси (календарь Jalali) в объект DateTime?

Я столкнулся с несколькими замечательными библиотеками кода для преобразования даты персидского (Jalali calendar) в григорианскую дату. Однако исходным исходным кодом является строка, а не объект DateTime. По-видимому, официальная поддержка в .NET framework для синтаксического анализа дат с использованием персидского календаря (если я ошибаюсь, пожалуйста, покажи мне!).

Моя цель:

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

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

EDIT: Я знаю о типичной функциональности DateTime.Parse. Персидский календарь нельзя использовать, потому что Microsoft оставила его неполным и/или не исправит. Если кто-нибудь может указать мне на какой-то персидский синтаксический код, я был бы благодарен. Если нет, я попрошу кого-нибудь удалить вопрос и просто написать его сам.

4b9b3361

Ответ 1

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

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

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

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

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

Рассмотрим этот код для преобразования из Jalali Date (здесь 1387/03/18) в григорианский DateTime:

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

и следующий код для преобразования Gregorian DateTime (здесь 1983/08/03) в строку Persian Date:

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 год Джалали (с 1799 по 2256 григорианский)

Обновление:

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

Ответ 3

Или:

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

Ответ 4

попробуйте в 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")]

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

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