Apakah ada konverter yang benar untuk tanggal Hijriah ke tanggal Gregorian


10

Saya telah bekerja di banyak proyek dengan konversi tanggal. misalnya, saya bekerja di kalender matahari dan bagaimana mengubahnya menjadi tanggal Gregorian dan sebaliknya. Kalender matahari (kalender Persia) hampir mirip dengan tanggal Gregorian dalam hal jumlah hari dalam setahun [melompat atau tidak].
Tetapi saya baru-baru ini mengerjakan sebuah proyek dengan kalender lunar. Ketika saya meneliti kalender Lunar, saya menyadari bahwa tidak ada satu pun metode logis untuk mengubah sistem bulan menjadi surya (setidaknya sejauh yang saya tahu).
Berikut adalah beberapa tautan referensi yang saya teliti:

  1. Tidak dapat mengonversi dari Tanggal Hijriah ke tanggal Gregorian (c #)
  2. Konversi tanggal dari Kalender Hijriah ke Kalender Gregorian dan sebaliknya
  3. Hijri Date To gregorian menggunakan DateTime.Parse
  4. Ubah tanggal Hijriah menjadi data Gregorian

Ketika saya mengikuti tautan di atas, pelatihan, dan menguji orang-orang yang menyajikan algoritma, saya perhatikan bahwa tidak ada yang benar-benar benar.

Cukuplah untuk mengatakan, cukup Konversikan "1441/02/30" [Safar 30th]ke tanggal Gregorian yang setiap metode yang ingin Anda coba.

Gambar berikut berguna untuk contoh yang disebutkan di atas. masukkan deskripsi gambar di sini

Saya taruh di sini beberapa kode tes saya dan gagal:

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

Kesalahan untuk Kode di atas:

DateTime yang diwakili oleh string tidak didukung di Sistem kalender. Globalisasi.HijriCalendar.

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

Kesalahan untuk Kode di atas:

"Hari harus antara 1 dan 29 untuk bulan 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();

Kesalahan untuk Kode di atas:

"Hari harus antara 1 dan 29 untuk bulan 2."

Setelah itu, saya mencoba untuk memahami bahwa adakah algoritma untuk menyebarkan tanggal Hijriah yang dikonversi menjadi tanggal Gregorian?
Jadi saya menguji beberapa konverter tanggal online Islam dan saya terkejut!
Coba masukkan "1441/2/30"kedua konverter tanggal.
yang pertama kembali October 30, 2019
Dan yang kedua kembali 29 October 2019
Hijriah gregorian-converter
Islamic Date Converter - Gregorian Calendar Converter

Jadi saya tidak tahu apakah ada algoritma nyata untuk mengubah tanggal Hijriah menjadi Gregorian.
Terima kasih sebelumnya atas waktu Anda.

Untuk info lebih lanjut, https://www.wikiwand.com/simple/Islamic_calendar


Pembaruan : Saya tahu tidak ada perpustakaan yang benar untuk mengetahui. tetapi jika seseorang memiliki pengetahuan atau detail tentang Kalender Hijriah (semua antarmuka-nya) tolong jelaskan di sini saya benar-benar ingin menggunakan kalender Hijriah untuk semua.


haruskah contoh Anda memberikan hasil pada 17-Oktober-2019?
snr - Pasang kembali Monica

Ketika Anda mencoba contoh Anda di searchtruth.com/hijri , hasilnya salah tanggal ??
snr - Pasang kembali Monica

Saya benar-benar tidak tahu apa output yang benar, karena dua konverter tanggal Islam yang saya sebutkan di posting saya, output harus October 30, 2019 wedatau October 29, 2019 tue. Saya sudah mencoba sekarang.
Reza Paidar

tanggal input Anda tampaknya salah. Jika Anda mendapatkan 1441, bukannya 1442 untuk 30 lebih aman. Periksa kebenaran tanggal Anda.
snr - Pasang kembali Monica

1
@Gus: Kalender Persia digunakan untuk tata surya dan diciptakan oleh Omar khayyamahli matematika Persia. Kalender Persia memiliki 365 hari (366 dalam satu tahun kabisat) tetapi kalender Lunar adalah 11-12 hari lebih rendah dari kalender Persia.
Reza Paidar

Jawaban:


1

Anda dapat menggunakan sesuatu seperti kode ini untuk mengkonversi dan mengurai string kalender hijriah ke DateTime gregorian.

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

}

terima kasih atas waktu dan solusi Anda. Tapi saya sudah menguji solusi Anda dan melempar kesalahan Day must be between 1 and 29 for month 2. Parameter name: day. Seperti yang kami katakan sebelumnya dalam komentar posting saya, bulan Safar Hijriah lain (lunar) memiliki jumlah hari variabel. solusi Anda memiliki kesalahan yang sama dengan solusi lainnya.
Reza Paidar

Mungkin ada bug di Kelas HijriCalendar dari .Net jadi saya mengedit kode dan memiliki solusi untuk pengecualian.
Ali Hamidi

Terima kasih. Saya tidak bisa mengatakan bahwa ada bug dengan .net liberary dalam kasus ini. Saya perhatikan bahwa ada lebih dari satu antarmuka zaman dengan hijri calander tanpa penjelasan logis. Solusi Anda adalah cheat to skip error, bukan jawaban yang cukup dan akurat. Namun saya akan memilih Anda untuk memberi waktu
Reza Paidar

Saya telah melihat kode sumber Kelas HijriCalendar . itu memeriksa DaysInMonth sebelum mengubah tanggal. Diasumsikan 29 hari untuk Safar (bulan 2). Jadi ia memiliki bug kecil untuk bulan ini
Ali Hamidi

1
Jika Anda memeriksa komentar pada postingan saya, microsoft memperkenalkan dokumentasi untuk kalender hijriah dan Anda dapat menemukannya di sana Safar dan bulan lainnya secara statis memiliki 29 hari. Jadi, dalam beberapa hal Anda benar, ini adalah bug untuk perpustakaan ini.
Reza Paidar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.