Bagaimana Cara Kerjannya?
Kalau anda seorang peminat di bidang Matematika dan Pemrograman dengan komputer, pastinya anda penasaran bagaimana cara kerja program untuk mengubah dari kelender Hijriah ke kalender Masehi dan sebaliknya mengubah dari kalender Masehi ke kalender Hijriah. Sebelum menulis program komputer, tentunya anda harus tahu seluk-beluk kalender. Saya anjurkan anda membaca artikel saya tentang kalender bulan, bila anda ingin tahu tentang hal tersebut. Seperti biasa saya menulis program komputer dalam bahasa javascript. Selanjutnya saya menganggap anda seorang programmer javascript.
Ayo kita intip code javascriptnya. Inti dari program ini adalah mengubah tanggal menjadi hitungan hari. Saya menghitung tanggal 1 Muharram 1420H sebagai hari ke-1. Tanggal 2 Muharram 1420H sebagai hari ke-2 dan seterusnya. Fungsi yang mengubah tanggal Hijriah menjadi hitungan hari sejak 1 Muharram 1420 adalah DaysHijri (baris 021). Hal menarik dalam mencari hitungan hari saya memakai lamanya 1 tahun lunar _lunarY = 354.367068 hari (baris 001, baris 024), bukan seperti kalender Hijriah tradisional, satu tahun lunar adalah 354+11/30 = 354.366667 hari. Hal tersebut dimaksudkan agar hitungan kalender ini akurat sampai 1000 tahun ke depan (sampai dunia kiamat!!!).
Kita perlu juga mengubah tanggal Gregorian menjadi hitungan hari, ini dilakukan oleh fungsi Days (baris). Fungsi DaysHijri dan fungsi Days harus kompatibel alias menghasilkan bilangan yang sama untuk hari yang sama. Jadi Days akan menghasilkan bilangan 1 untuk 1 Muharram 1420 atau bertepatan dengan 18 April 1999. Hal tersebut dicapai dengan memberi offset 196 (baris 017). Fungsi Days yang cukup jenius ini, hasil nyontek dari Astronom kenamaan: Jean Meeus.
Kalau fungsi mencari hari dari kedua sistem kalender sudah saling kompatibel, maka kedua kalender tersebut bisa saling konversi. Hal tersebut dicapai dengan menyamakan hitungan hari. Cara menyamakan dengan cara trial-error menggunakan loop while. Sebelumnya perkirakan tahun Hijriah dicari dengan membagi bilangan hari dengan satu tahun lunar _lunarY (baris 031). Perkiraaan tahun Masehi dicari dengan membagi bilangan hari dengan satu tahun solar _solarY(baris 052). Sebelumnya bilangan hari dikurangi dengan 258 agar pada tanggal 1 januari 2000 menghasilkan bilangan 1 (baris 051).
Sekalipun perhitungan ini dimulai pada 1 Muharram 1420, tetapi bisa menghitung ke belakang (bilangan hari negatif) asalkan jangan kurang dari tahun 1582 Masehi. Karena sebelum tahun 1582 Masehi tidak berlaku kalender Gregorian, melainkan kalender Julian. Sampai disini dulu, semoga tulisan ini bermanfaat.
001 var _lunarY = 354.367068
002 var _solarY = 365.2425
003
004 function tgl(Y, M, D){
005 this.day = D;
006 this.month = M;
007 this.year = Y;
008 }
009
010 function Days(Y, M, D){
011 if (M < 3){ Y -= 1; M +=12}
012 Y = Y - 2000
013 var d1 = Math.floor(365.25*Y)
014 var d2 = Math.floor(30.6001*(M + 1))
015 var A = Math.floor(Y/100)
016 var B = Math.floor(Y/400)
017 var hari = d1 + d2 - A + B + D + 196
018 return hari
019 }
020
021 function DaysHijri(Y, M, D){
022 var d1 = Math.floor(29.5*M - 28.999)
023 Y = Y - 1420
024 var d2 = Math.floor(_lunarY*Y)
025 var hari = d1 + d2 + D
026 return hari
027 }
028
029 function toHijri(tanggal){
030 var nday = Days(tanggal.year, tanggal.month, tanggal.day)
031 var tahun = Math.floor(nday/_lunarY) + 1420
032 var bulan = 1
033 var harike = 1
034
035 while(DaysHijri(tahun, bulan, 1) <= nday){tahun++}
036 tahun--
037
038 while(DaysHijri(tahun, bulan, 1) <= nday){bulan++}
039 bulan--
040
041 harike = 1 + nday - DaysHijri(tahun, bulan, 1)
042 if (bulan == 13){bulan = 12; harike += 29}
043
044 tanggal.day = harike
045 tanggal.month = bulan
046 tanggal.year = tahun
047 }
048
049 function toGregorian(tanggal){
050 var nday = DaysHijri(tanggal.year, tanggal.month, tanggal.day)
051 var nday1 = nday - 258
052 var tahun = Math.floor(nday1/_solarY) + 2000
053 var bulan = 1
054 var harike = 1
055
056 while(Days(tahun, bulan, 1) <= nday){tahun++}
057 tahun--
058
059 while(Days(tahun, bulan, 1) <= nday){bulan++}
060 bulan--
061
062 harike = 1 + nday - Days(tahun, bulan, 1)
063
064 tanggal.day = harike
065 tanggal.month = bulan
066 tanggal.year = tahun
067 }