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.


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

}

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.