Чи є який-небудь правильний перетворювач дат Хіджрі на григоріанські дати


10

Я працюю над багатьма проектами з перетворенням дат. наприклад, я працюю над сонячним календарем і як їх перетворити на григоріанські дати і навпаки. Сонячний календар (персидський календар) майже схожий на григоріанську дату за кількістю днів у році [стрибок чи ні].
Але я нещодавно працював над проектом з місячним календарем. Під час дослідження місячного календаря я зрозумів, що не існує жодного логічного методу перетворення місячної системи в сонячну (принаймні, наскільки я знаю).
Ось декілька посилань, які я досліджував на них:

  1. Неможливо перетворити з дати "Хіджрі" на "Григоріанську дату" (c #)
  2. Перетворіть дату з календаря гіджрі в григоріанський календар і навпаки
  3. Hijri Date Для григоріанського, використовуючи DateTime.Parse
  4. Перетворити дату Хіджі в григоріанський дат

Коли я дотримувався вищезазначених посилань, навчання та тестування людей, що представляли алгоритми, я помітив, що жоден з них не є абсолютно правильним.

Досить сказати, просто перетворіть "1441/02/30" [Safar 30th]на григоріанську дату кожен метод, який ви хочете спробувати.

Наступне зображення є корисним для вищезгаданого прикладу. введіть тут опис зображення

Я ставлю сюди свої тестові коди та помилки:

CultureInfo arSA = new CultureInfo("ar-SA");
arSA.DateTimeFormat.Calendar = new HijriCalendar();
var dateValue = DateTime.ParseExact("1441/02/30", "yyyy/MM/dd", arSA);
return dateValue.ToString();

Помилка вищевказаного коду:

DateTime, представлений рядком, не підтримується в календарі System.Globalization.HijriCalendar.

HijriCalendar hc = new HijriCalendar();
DateTime date = new DateTime(1441, 2, 30, hc);
return date.ToString();

Помилка вищевказаного коду:

"День повинен бути від 1 до 29 для другого місяця."

string hijri = "1441/2/30";
HijriCalendar hc = new HijriCalendar();
int year = int.Parse(hijri.Substring(0, 4));
string rem = hijri.Remove(0, 5);
int end = rem.IndexOf('/', 0);
int month = int.Parse(rem.Substring(0, end));
rem = rem.Remove(0, end + 1);
int day = int.Parse(rem);
DateTime date = new DateTime(year, month, day, hc);
return date.ToShortDateString();

Помилка вищевказаного коду:

"День повинен бути від 1 до 29 для другого місяця."

Після цього я намагався зрозуміти, що існує алгоритм розгортання дат перетворення Hijri в дату григоріанської?
Тож я тестую деякий ісламський онлайн-конвертер дат і мене здивувало!
Просто спробуйте ввести "1441/2/30"обидва перетворювачі дат.
перший, що повертається, October 30, 2019
а другий, що повертається, 29 October 2019
іджикський григоріанський перетворювач ісламських перетворювачів
дат

Тож я не знаю, чи існує якийсь реальний алгоритм перетворення дат Хіджі на григоріанські.
Заздалегідь дякую за ваш час.

Для отримання додаткової інформації https://www.wikiwand.com/simple/Islamic_calendar


Оновлення : Я знаю, що немає жодної правильної бібліотеки для ноу-хау. але якщо хтось має знання або детальну інформацію про календар Хіджі (весь його інтерфейс), будь ласка, просто опишіть тут, я дійсно хочу розгорнути календар Hidri для всіх.


чи повинен ваш приклад дати результат як 17 жовтня-2019?
snr - Відновіть Моніку

Якщо ви спробуєте свій приклад на searchtruth.com/hijri , це призводить до неправильної дати ??
snr - Відновіть Моніку

Я дійсно не знаю, що правильний вихід, через два ісламських перетворювача дат, про які я згадував у своїй посаді, вихід повинен бути October 30, 2019 wedабо October 29, 2019 tue. Я спробував зараз.
Реза Пайдар

дата введення здається неправильною. Якщо ви отримаєте в 1441 році замість 1442 на 30-ту безпечнішу. Перевірте правильність своєї дати.
snr - Відновіть Моніку

1
@Gus: Персидський календар використовується для Сонячної системи і винайдений Omar khayyamперським математиком. Перський календар має 365 днів (366 у високосний рік), але місячний календар на 11-12 днів менше, ніж у перського календаря.
Реза Пайдар

Відповіді:


1

Ви можете використовувати щось на кшталт цього коду для перетворення та розбору рядків календаря хиджрі в григоріанський DateTime.

//assuming current culture is like en-us or something with gregorian calendar
string hijri = "1441/2/30";
HijriCalendar hc = new HijriCalendar();
var dateParts = hijri.Split('/');
DateTime? gregorianDate=null;
if (dateParts.Length == 3 && int.TryParse(dateParts[0], out int year) &&
     int.TryParse(dateParts[1], out int month) && int.TryParse(dateParts[2], out int day))
{
      if(month == 2 && day==30)
      {
         var temp = hc.ToDateTime(year, month, 29, 0, 0, 0, 0);
         gregorianDate = temp.AddDays(1);
      }
      else
      {
         gregorianDate = hc.ToDateTime(year, month, day, 0, 0, 0, 0);
      }

}

дякую за ваш час і ваше рішення. Але я вже тестую ваше рішення, і це кидає помилку Day must be between 1 and 29 for month 2. Parameter name: day. Як ми вже заперечували в коментарях до мого повідомлення, Сафар іншого місяця Хідрі (місячний) має змінний день. ваше рішення має таку ж помилку, як і інші рішення.
Реза Пайдар

Може бути помилка в класі HijriCalendar .Net, тому я відредагував код, і він має вирішення для виключення.
Алі Хаміді

Дякую. Я не можу сказати, що в цьому випадку є помилка .net liberary. Я помітив, що існує більше одного інтерфейсу - це епохи з каландром хиджрі без будь-якого логічного опису. Ваше рішення - це чіт пропустити помилку не зовсім та точної відповіді. Однак я проголосую за надання часу
Реза Пайдар

Я бачив вихідний код класу HijriCalendar . він перевіряє DaysInMonth перед перетворенням дат. Для Сафару це потрібно 29 днів (2 місяць). Тож у цьому місяці є невеликий помилок
Алі Хаміді

1
Якщо ви перевірите коментарі до моєї публікації, компанія microsoft представила документацію для календаря хиджрі, і ви можете дізнатися, що там Сафар та інший місяць має статичні 29 днів. Тож якимось чином ви праві, це помилка цієї бібліотеки.
Реза Пайдар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.