Есть ли правильный конвертер для дат Хиджры в григорианские даты?


10

У меня есть работа над многими проектами с конвертированными датами. например, я работаю над солнечным календарем и как конвертировать их в григорианские даты и наоборот. Солнечный календарь (персидский календарь) почти аналогичен григорианской дате с точки зрения количества дней в году [прыжок или нет].
Но недавно я работал над проектом с лунным календарем. Когда я исследовал Лунный календарь, я понял, что не существует единого логического метода для преобразования лунной системы в солнечную (по крайней мере, насколько я знаю).
Вот несколько ссылок, которые я исследовал на них:

  1. Невозможно преобразовать дату хиджры в григорианскую дату (c #)
  2. Конвертировать дату из календаря хиджры в григорианский календарь и наоборот
  3. Хиджры Дата Для григорианского использования 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 для месяца 2».

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 для месяца 2».

После этого я пытался понять, есть ли какой-нибудь алгоритм развертывания конвертированной даты хиджры в григорианскую дату?
Итак, я протестировал какой-то исламский онлайн конвертер дат, и я удивился!
Просто попробуйте ввести "1441/2/30"оба конвертера даты.
первый возвращается October 30, 2019
а второй возвращается 29 October 2019
хиджри григорианский-конвертер
григорианский исламский конвертер дат - конвертер григорианского календаря

Так что я не знаю, существует ли какой-нибудь реальный алгоритм для преобразования дат Хиджры в григорианский.
Спасибо заранее за ваше время.

Для получения дополнительной информации, https://www.wikiwand.com/simple/Islamic_calendar


Обновление : я знаю, что нет никакой правильной библиотеки для знания. но если у кого-то есть знания или подробности о календаре хиджры (весь его интерфейс), пожалуйста, просто опишите здесь, я действительно хочу развернуть календарь хиджри для всех.


должен ли ваш пример выводить как 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. Как мы уже говорили в комментариях к моему сообщению, в сафаре другого хиджрского (лунного) месяца количество переменных дней различно. Ваше решение имеет такую ​​же ошибку, как и другие решения.
Реза Пайдар

Возможно, есть ошибка в классе .Net HijriCalendar, поэтому я отредактировал код, и у него есть обходной путь для исключения.
Али Хамиди

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

Я видел исходный код класса HijriCalendar . это проверка DaysInMonth перед преобразованием дат. Предполагается 29 дней для Safar (месяц 2). Так что в этом месяце есть небольшая ошибка
Али Хамиди

1
Если вы проверяете комментарии к моему сообщению, Microsoft представила документацию для календаря хиджры, и вы можете узнать, что там Safar и в другом месяце статически 29 дней. Так что в некотором смысле вы правы, это ошибка для этой библиотеки.
Реза Пайдар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.