Преобразование HijriCalendar в григорианский в формах Xamarin

Я пытаюсь преобразовать HijriCalendar в григорианский календарь в приложении Xamarin Forms. Однако похоже, что Xamarin Android этим не доволен. Я не тестировал его в Xamarin iOS. Я использую код из Не удается преобразовать дату по хиджре в дату по григорианскому календарю ( c #), и я получаю исключение ниже при создании экземпляра объекта HijriCalendar в строке

DTFormat.Calendar = new System.Globalization.HijriCalendar(); //exception is thrown

{System.ArgumentOutOfRangeException: недопустимый календарь для данной культуры. Имя параметра: значение в System.Globalization.DateTimeFormatInfo.set_Calendar (значение System.Globalization.Calendar) [0x00142]

Я проверил преобразование дат между календарями в решении Xamarin.Android, но это предлагает другую библиотеку, которую мне неинтересно использовать. Я изменил свойства Linking в Android Project на None, Sdk Assemblyies Only и Sdk & User Assembly, но не работал. Итак, как преобразовать григорианскую дату в HijriDate в формах Xamarin?

Я также добавил следующие коды в метод OnCreate в Xamarin Android из Тайский сбой: недействительный календарь для данной культуры

_ = new System.Globalization.GregorianCalendar();
_ = new System.Globalization.HijriCalendar();
_ = new System.Globalization.PersianCalendar();
_ = new System.Globalization.UmAlQuraCalendar();
_ = new System.Globalization.ThaiBuddhistCalendar();

person ARH    schedule 30.11.2020    source источник
comment
forum.xamarin.com/discussion/128789/   -  person Russ J    schedule 01.12.2020


Ответы (2)


Попробуйте использовать System.DateTime:

Calendar hijiri = new HijriCalendar();
DateTime date = new DateTime(1442, 4, 15, hijiri);
Console.WriteLine(date.Year); // 2020
Console.WriteLine(date.Month);//11
Console.WriteLine(date.Day); // 30


Calendar gregorian = new GregorianCalendar();
DateTime d = new DateTime(2020, 11, 30, gregorian);
var year = hijiri.GetYear(d);  //1442
var month = hijiri.GetMonth(d);  //4
var day = hijiri.GetDayOfMonth(d);  //15

и другой способ - использовать NodaTime.

person Leo Zhu - MSFT    schedule 01.12.2020
comment
Это работает, но результат мне кажется неправильным. Результат должен быть 1442,4,15 соответственно для года, месяца и дня. См. islamicity.org/hijri-gregorian-converter - person ARH; 01.12.2020
comment
Ваш ответ и руководство по этой ссылке помогают мне преобразовать HijriCalendar в григорианский и наоборот. - person ARH; 01.12.2020
comment
@ARH Это моя ошибка. Я просто показываю один способ, не используя правильную дату, вы можете обратиться к обновлению выше. Если это полезно для вас, не могли бы вы отметить его как приемлемый ответ. - person Leo Zhu - MSFT; 02.12.2020

Я обнаружил аналогичную проблему по этой ссылке https://github.com/xamarin/Xamarin.Forms/issues/4037

// These classes won't be linked away because of the code,
// but we also won't have to construct unnecessarily either,
// hence the if statement with (hopefully) impossible
// runtime condition.
//
// This is to resolve crash at CultureInfo.CurrentCulture
// when language is set to Thai. See
// https://github.com/xamarin/Xamarin.Forms/issues/4037
if (Environment.CurrentDirectory == "_never_POSSIBLE_")
{
    new System.Globalization.ChineseLunisolarCalendar();
    new System.Globalization.HebrewCalendar();
    new System.Globalization.HijriCalendar();
    new System.Globalization.JapaneseCalendar();
    new System.Globalization.JapaneseLunisolarCalendar();
    new System.Globalization.KoreanCalendar();
    new System.Globalization.KoreanLunisolarCalendar();
    new System.Globalization.PersianCalendar();
    new System.Globalization.TaiwanCalendar();
    new System.Globalization.TaiwanLunisolarCalendar();
    new System.Globalization.ThaiBuddhistCalendar();
    new System.Globalization.UmAlQuraCalendar();
}

Удачи!

person WhiteBite    schedule 30.11.2020
comment
Я перешел по этой ссылке и github.com/xamarin/Xamarin.Forms/issues/4037 (Добавлен метод OnCreate для этих языков в xamarin Android, но не сработал) - person ARH; 01.12.2020