Есть ли правильный конвертер для дат Хиджры в григорианские даты? - PullRequest
10 голосов
/ 14 января 2020

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

  1. Невозможно преобразовать дату хиджры в григорианскую дату (c#)
  2. преобразовать дату из календаря хиджры в григорианский Календарь и наоборот
  3. Дата хиджры Для григорианского использования DateTime.Parse
  4. Преобразование даты хиджры в григорианские данные

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

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

Следующее изображение полезно для вышеупомянутого примера. enter image description here

Я положил сюда несколько тестовых кодов и провал:

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

The ошибка для вышеуказанного кода:

"День должен быть между 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».

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

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

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


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

1 Ответ

1 голос
/ 14 января 2020

Вы можете использовать что-то вроде этого кода для преобразования и анализа строк календаря хиджры в григорианский 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);
      }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...