Hijri 날짜를 그레고리력 날짜로 변환하는 올바른 변환기가 있습니까?


10

날짜 변환이있는 많은 프로젝트에서 일하고 있습니다. 예를 들어, 나는 태양 달력과 그레고리력 날짜로 변환하는 방법과 그 반대의 방법으로 작업합니다. 태양력 달력 (페르시아 력)은 그레고리력 날짜와 거의 비슷합니다.
그러나 최근에는 음력 달력으로 프로젝트를 진행했습니다. 음력을 연구하면서 음력 시스템을 태양으로 변환하는 논리적 방법이 하나도 없다는 것을 깨달았습니다 (최소한 아는 한).
여기에 내가 조사한 참고 문헌 링크가 있습니다.

  1. Hijri Date에서 Gregorian 날짜 (C #)로 변환 할 수 없습니다
  2. Hijri Calendar에서 Gregorian Calendar로 날짜를 변환하거나 그 반대로
  3. DateTime.Parse를 사용하여 Hijri 날짜를 gregorian
  4. Hijri 날짜를 Gregorian dat로 변환

위의 링크, 교육 및 테스트 사람들이 제시 한 알고리즘을 따라 가면서 절대적으로 올바른 것은 없다는 것을 알았습니다.

말하자면, "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();

위의 코드에 대한 오류 :

"2 월은 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();

위의 코드에 대한 오류 :

"2 월은 1 일에서 29 일 사이 여야합니다."

그 후, 변환 Hijri 날짜를 Gregorian 날짜로 배포하는 알고리즘이 있다는 것을 이해하려고했습니다.
그래서 나는 이슬람 온라인 날짜 변환기를 테스트하고 놀랐습니다! 두 날짜 변환기에 모두
입력하십시오 "1441/2/30".
첫 번째 반환 October 30, 2019
및 두 번째 반환 29 October 2019
Hijri gregorian-converter
이슬람 날짜 변환기-Gregorian Calendar Converter

그래서 나는 Hijri 날짜를 Gregorian로 변환하는 실제 알고리즘이 무엇인지 모른다.
시간 내 주셔서 감사합니다.

자세한 내용은 https://www.wikiwand.com/simple/Islamic_calendar


업데이트 : 올바른 라이브러리가 없다는 것을 알고 있습니다. 그러나 누군가가 Hijri Calendar (모든 인터페이스)에 대한 지식이나 세부 사항을 알고 있다면 여기에 설명하십시오.


예제는 2019 년 10 월 17 일로 출력을 제공해야합니까?
snr-복 직원 모니카

searchtruth.com/hijri 에서 예제를 시도하면 잘못된 날짜가 발생합니다 ??
snr-복 직원 모니카

내 게시물에서 언급 한 두 개의 이슬람 날짜 변환기로 인해 올바른 출력이 무엇인지 실제로 알지 못합니다 . 출력은 October 30, 2019 wed또는 이어야합니다 October 29, 2019 tue. 나는 지금 시도했다.
Reza Paidar

입력 날짜가 잘못되었습니다. 30 번째 안전을 위해 1442 년 대신 1441 년에 탑승하면 날짜가 정확한지 확인하십시오.
snr-복 직원 모니카

1
@Gus : 페르시아 력은 태양계에 사용되고 Omar khayyam페르시아 수학자가 발명했습니다 . 페르시아 력은 365 일 (윤년에는 366)이지만 달 음력은 페르시아 력보다 11-12 일 짧다.
Reza Paidar

답변:


1

이 코드와 같은 것을 사용하여 hijri 일정 문자열을 그레고리력적인 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합니다. 우리가 이전 글에서 언급했듯이, 또 다른 Hijri (lunar) 월의 Safar에는 가변 일수가 있습니다. 귀하의 솔루션은 다른 솔루션과 유사한 오류가 있습니다.
Reza Paidar

.Net 의 HijriCalendar 클래스에 버그가있을 수 있으므로 코드를 편집했으며 예외에 대한 해결 방법이 있습니다.
알리 Hamidi

감사. 이 경우 .net 자유에 버그가 있다고 말할 수 없습니다. 논리적 설명이없는 hijri calander가있는 인터페이스가 둘 이상이라는 것을 알았습니다. 귀하의 솔루션은 정확하고 정확한 답변이 아닌 오류를 건너 뛰는 사기입니다. 그러나 저는 시간을 내 주셔서 투표합니다
Reza Paidar

HijriCalendar Class 의 소스 코드를 보았습니다 . 날짜를 변환하기 전에 DaysInMonth를 확인 중입니다. Safar의 경우 29 일 (2 개월)로 가정합니다 . 이달에는 작은 버그가 있습니다
Ali Hamidi

1
내 게시물에 대한 의견을 확인하면 Microsoft가 hijri 일정에 대한 설명서를 소개했으며 Safar 및 다른 달에는 정적으로 29 일이 있음을 알 수 있습니다. 그래서 어떤면에서는 당신이 맞습니다.이 라이브러리의 버그입니다.
Reza Paidar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.