Existe algum conversor correto para datas islâmicas para datas gregorianas

10

Tenho trabalho em muitos projetos com conversões de datas. por exemplo, trabalho no calendário solar e como convertê-los em datas gregorianas e vice-versa. O calendário solar (calendário persa) é quase semelhante à data gregoriana em termos do número de dias em um ano [pulando ou não].
Mas recentemente trabalhei em um projeto com o calendário lunar. Ao pesquisar no calendário lunar, percebi que não existe um método lógico para converter o sistema lunar em solar (pelo menos até onde eu sei).
Aqui estão alguns links de referência que eu pesquisei sobre eles:

  1. Não é possível converter de Data do Hijri para Data Gregoriana (c #)
  2. Converter data do calendário islâmico para calendário gregoriano e vice-versa
  3. Data islâmica Para gregoriano usando DateTime.Parse
  4. Converter data do Hijri para dat gregoriano

Ao seguir os links acima, o treinamento e o teste das pessoas apresentaram algoritmos, notei que nenhum deles está absolutamente correto.

Basta dizer, basta converter "1441/02/30" [Safar 30th]para a data gregoriana, com todos os métodos que você deseja tentar.

A imagem a seguir é útil para o exemplo mencionado acima. insira a descrição da imagem aqui

Coloquei aqui alguns códigos de teste e falhei:

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

O erro para o código acima:

O DateTime representado pela seqüência de caracteres não é suportado no calendário System.Globalization.HijriCalendar.

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

O erro para o código acima:

"O dia deve estar entre 1 e 29 para o mês 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();

O erro para o código acima:

"O dia deve estar entre 1 e 29 para o mês 2."

Depois disso, eu estava tentando entender que existe algum algoritmo para implantar a data da conversão Hijri em data gregoriana?
Então, testei um conversor islâmico de datas online e fiquei surpreso!
Apenas tente inserir os "1441/2/30"dois conversores de data.
o primeiro retornando October 30, 2019
E o segundo retornando 29 October 2019
Hijri gregorian-converter
Islamic Date Converter - Gregorian Calendar Converter

Portanto, não sei se existe algum algoritmo real para converter datas islâmicas em gregoriano.
Agradeço antecipadamente pelo seu tempo.

Para mais informações, https://www.wikiwand.com/simple/Islamic_calendar


Atualização : eu sei que não existe uma biblioteca correta para saber. mas se alguém tiver conhecimento ou detalhes sobre o calendário islâmico (toda a sua interface), descreva aqui que eu realmente quero implantar um calendário islâmico para todos.

Reza Paidar
fonte
seu exemplo deve fornecer saída como 17 de outubro de 2019?
snr - Restabelece Monica
Quando você tenta seu exemplo em searchtruth.com/hijri , resulta em data errada?
snr - Restabelece Monica
Eu realmente não sei qual é a saída correta, devido a dois conversores islâmicos de data que eu mencionei no meu post, a saída deve ser October 30, 2019 wedou October 29, 2019 tue. Eu tentei agora.
Reza Paidar
sua data de entrada parece errada. Se você entrar em 1441 em vez de 1442 para o 30º mais seguro. Verifique a correção da sua data.
snr - Restabelece Monica
11
@Gus: o calendário persa está sendo usado no sistema solar e inventado por Omar khayyam matemático persa. O calendário persa tem 365 dias (366 em um ano bissexto), mas o calendário lunar é 11-12 dias menor que o calendário persa.
Reza Paidar 14/01

Respostas:

1

Você pode usar algo parecido com este código para converter e analisar seqüências de caracteres do calendário islâmico em DateTime gregoriano.

//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);
      }

}
Ali Hamidi
fonte
obrigado pelo seu tempo e sua solução. Mas eu já testei sua solução e ela gera um erro Day must be between 1 and 29 for month 2. Parameter name: day. Como discutimos anteriormente em meus comentários, o Safar de outro mês islâmico (lunar) tem uma contagem variável de dias. sua solução tem o mesmo erro semelhante a outras soluções.
Reza Paidar
Pode haver um erro na classe HijriCalendar do .Net, então editei o código e ele tem uma solução alternativa para a exceção.
Ali Hamidi 14/01
Obrigado. Não posso dizer que há um erro com o .net libertador neste caso. Percebi que há mais de uma interface que é epoches com hijri calander sem nenhuma descrição lógica. Sua solução é uma fraude para pular o erro, não uma resposta exata e exata. No entanto, vou votar em você por dar tempo
Reza Paidar
Eu vi o código fonte da classe HijriCalendar . está verificando DaysInMonth antes de converter as datas. Pressupõe 29 dias para o Safar (mês 2). Portanto, ele tem um pequeno bug para este mês
Ali Hamidi
11
Se você verificar os comentários no meu post, a Microsoft introduziu a documentação para o calendário islâmico e você pode descobrir que o Safar e outro mês têm estática 29 dias. Então, de alguma forma, você está certo, este é um bug para esta biblioteca.
Reza Paidar 14/01