Hicri tarihleri ​​için Gregoryen tarihleri ​​için doğru dönüştürücü var mı?


10

Tarih dönüştüren birçok projede çalışıyorum. örneğin, güneş takvimi ve bunları Gregoryen tarihlerine nasıl dönüştüreceğim ve tam tersi. Güneş takvimi (Farsça takvimi) bir yıldaki gün sayısı (sıçrama ya da değil) açısından Gregoryen tarihine neredeyse benzer.
Ama son zamanlarda ay takvimi ile bir proje üzerinde çalıştım. Ay takvimi üzerinde araştırma yaparken, ay sistemini güneş enerjisine (en azından bildiğim kadarıyla) dönüştürmek için tek bir mantıksal yöntem olmadığını fark ettim.
Onları araştırdığım bazı referans bağlantıları:

  1. Hicri Tarih'ten Gregoryen tarihine dönüştürülemiyor (c #)
  2. Tarihi Hicri Takvim'den Gregoryen Takvime dönüştürün ve tam tersi
  3. Hicri Tarih DateTime.Parse kullanarak gregorian için
  4. Hicri tarihini Gregorian dat birimine dönüştür

Yukarıdaki bağlantıları takip ettiğimde, eğitim ve test yapan insanlar algoritmalar sundular, hiçbirinin kesinlikle doğru olmadığını fark ettim.

Söylemek yeterli, sadece "1441/02/30" [Safar 30th]hangi yöntemi denemek istediğiniz Gregoryen tarihine dönüştürün .

Aşağıdaki görüntü, yukarıda belirtilen örnek için yararlıdır. resim açıklamasını buraya girin

Buraya bazı test kodlarımı koydum ve başarısız oldu:

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

Yukarıdaki Kod için hata:

Dizeyle temsil edilen DateTime, System.Globalization.HijriCalendar takviminde desteklenmez.

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

Yukarıdaki Kod için hata:

"2. ay için gün 1 ile 29 arasında olmalıdır."

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

Yukarıdaki Kod için hata:

"2. ay için gün 1 ile 29 arasında olmalıdır."

Bundan sonra, Hicri tarihini Gregoryen tarihine çevirmek için herhangi bir algoritma olduğunu anlamaya çalışıyordum?
Bu yüzden bazı İslami çevrimiçi tarih dönüştürücüyü test ediyorum ve şaşırdım! Her iki tarih dönüştürücüsünü de
girmeyi deneyin "1441/2/30".
geri dönen ilk October 30, 2019
ve ikinci geri dönen 29 October 2019
Hicri gregoryen-dönüştürücü
İslami Tarih Dönüştürücü - Gregoryen Takvim Dönüştürücü

Bu yüzden Hicri tarihlerini Gregoryen'e çevirmek için gerçek bir algoritma olduğunu bilmiyorum.
Zaman ayırdığınız için şimdiden teşekkür ederiz.

Daha fazla bilgi için https://www.wikiwand.com/simple/Islamic_calendar


Güncelleme : Bilmek için doğru bir kütüphane olmadığını biliyorum. ancak birisi Hicri Takvimi (tüm arayüzü) hakkında bilgi veya ayrıntıya sahipse, lütfen burada açıklayın. Gerçekten herkes için Hicri takvimi dağıtmak istiyorum.


Örneğiniz 17 Ekim 2019 olarak çıktı vermeli mi?
snr - Monica

Örneğinizi searchtruth.com/hijri adresinde denediğinizde yanlış tarihle sonuçlanıyor ??
snr - Monica

Gerçekten doğru çıktının ne olduğunu bilmiyorum, yazımda bahsettiğim iki İslam tarih dönüştürücüsü nedeniyle çıktı October 30, 2019 wedya da olmalı October 29, 2019 tue. Şimdi denedim.
Reza Paidar

giriş tarihiniz yanlış görünüyor. 30. daha güvenli 1442 yerine 1441 alırsanız. Tarihinizin doğruluğunu kontrol edin.
snr - Monica

1
@Gus: Farsça takvim güneş sistemini kullanıyor ve Omar khayyamFarsça matematikçi tarafından icat edildi . Fars takvimi 365 gün (artık yılda 366) ancak Ay takvimi Fars takviminden 11-12 gün daha az.
Reza Paidar

Yanıtlar:


1

Hicri takvim dizelerini gregoryan DateTime'a dönüştürmek ve ayrıştırmak için bu kod gibi bir şey kullanabilirsiniz.

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

}

zaman ayırdığınız ve çözümünüz için teşekkürler. Ama ben zaten çözümünüzü test ediyorum ve bu bir hata veriyor Day must be between 1 and 29 for month 2. Parameter name: day. Daha önce yazdığım yorumlarda tartıştığımız gibi, başka bir Hicri ayın Safarının değişken gün sayısı vardır. çözümünüz diğer çözümlere benzer şekilde aynı hataya sahiptir.
Reza Paidar

.Net HijriCalendar Sınıfı'nda bir hata olabilir, bu yüzden kodu düzenledim ve istisna için bir geçici çözümü var.
Ali Hamidi

Teşekkürler. Bu durumda .net liberary ile ilgili bir hata olduğunu söyleyemem. Birden fazla arayüzün hicap kevgir ile mantıklı bir açıklama olmadan dönem olduğunu fark ettim. Çözümünüz, hatayı atlamak için bir hile değil, doğru ve doğru bir cevap değil. Ancak zaman vermek için u oy vereceğim
Reza Paidar

HijriCalendar Class'ın kaynak kodunu gördüm . tarihleri ​​dönüştürmeden önce DaysInMonth'i kontrol ediyor. Safar için 29 gün olduğu varsayılmaktadır (2. ay). Yani bu ay için küçük bir hata var
Ali Hamidi

1
Yazımdaki yorumları kontrol ederseniz, microsoft hicri takvim için belgeler tanıttı ve orada Safar ve diğer ayın statik olarak 29 günü olduğunu öğrenebilirsiniz. Yani bir şekilde haklısın, bu kütüphane için bir hata.
Reza Paidar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.