Simulasi Hisab untuk Menentukan Awal Hari Puasa maupun Lebaran dengan Python

May 25, 2020, 7:32 a.m.   afifai  


sample image

Sebagai umat Muslim, tentunya Kita tidak asing dengan Sidang Isbat. Sidang ini biasanya sebagai penentuan awal dari beberapa Hari Raya umat Islam yang bergantung pada penanggalan Hijriyah, misalnya : 1 Ramadhan, Hari Raya Idul FItri, Hari Raya Idul Adha, dan keperluan lainnya.

Dalam Sidang Isbat, ada dua pendekatan untuk menentukan hari-hari tersebut, yaitu metode rukyatul hilal dan metode hisab.

Metode Rukyatul Hilal adalah aktivitas mengamati visibilitas hilal, yakni penampakan bulan sabit yang pertama kali tampak setelah terjadinya ijtimak. Rukyat dapat dilakukan dengan mata telanjang, atau dengan alat bantu optik seperti teleskop. Biasa metode ini memerlukan saksi beberapa orang dari beberapa daerah terpisah.

Selanjutnya 'Hisab secara harfiah merupakan 'perhitungan. Dalam dunia Islam istilah hisab sering digunakan dalam ilmu falak (astronomi) untuk memperkirakan posisi Matahari dan bulan terhadap bumi. Posisi Matahari menjadi penting karena menjadi patokan umat Islam dalam menentukan masuknya waktu salat. Sementara posisi bulan diperkirakan untuk mengetahui terjadinya hilal sebagai penanda masuknya periode bulan baru dalam kalender Hijriyah.

Beberapa waktu yang lalu, kedua metode ini membuahkan hasil yang berbeda. Hal ini yang menyebabkan beberapa Umat Islam merayakan Idul Fitri, Idul Adha maupun menjalankan Ibadah Puasa dengan selisih 1 Hari.

Mengapa bisa berbeda ? Metode Hisab memiliki toleransi yang lebih kecil dibandingkan Rukyatul Hilal. Untuk dapat melihat Hilal dengan mata telanjang / alat bantu optik, posisi Hilal harus berada 2 derajat diatas ufuk saat waktu Maghrib. Dapat dibayangkan jikaat waktu Maghrib hilal masih berada 0.x derajat diatas ufuk, maka Hilal tersebut tidak akan terlihat dengan mata kita, namun secara perhitungan hari tersebut sudah Bulan Baru sehingga ada kemungkinan hasil dari Rukyatul Hilal dan Hisab berbeda.

Maka dari itu, Sidang Isbat merupakan jalan tengah untuk kedua hasil tersebut. Apabila cuaca memungkinkan untuk melihat Hilal, maka Rukyatul Hilal diutamakan, dan apabila cuaca tidak memungkinkan, maka metode Hisab diutamakan. Namun, Muhammadiyah mengutamakan metode Hisab untuk menentukan hari-hari tersebut.

Saya tidak akan membahas mengenai perbedaan ini karena ini bukanlah post yang membahas dalil-dalil tentang hal tersebut. Namun pada post kali ini, Kita akan membuat script Python untuk menentukan awal Puasa maupun Lebaran dengan metode Hisab. Script kali ini dibatasi hanya sampai menentukan waktu Ijtima saja.

Apa itu waktu Ijtima ?

Ijtima (berasal dari Bahasa Arab), atau disebut pula konjungsi geosentris, adalah peristiwa di mana Bumi dan Bulan berada di posisi bujur langit yang sama, pada saat sekitar ijtimak, Bulan tidak dapat terlihat dari bumi, karena permukaan bulan yang tampak dari Bumi tidak mendapatkan sinar matahari, sehingga dikenal istilah Bulan Baru. Pada petang pertama kali setelah ijtima, Bulan terbenam sesaat sesudah terbenamnya matahari.

Ijtima merupakan pedoman utama penetapan awal bulan dalam Kalender Hijriyah.

Selanjutnya, Anda memerlukan pengetahuan dasar mengenai penanggalan Hijriyah, mulai dari urutan Bulan Hijriyah, jumlah hari per bulan, penanggalan kabisat Bulan Hijriyah, selisih antara kalender Hijriyah dan Masehi sampai Anggaran Baru Gregorius. Tapi tenang saja, kita tidak akan secara detail bahas satu persatu, saya akan lampirkan saja hal-hal yang dibutuhkan pada tutorial ini

Berikut adalah urutan Bulan Hijriyah beserta jumlah harinya :

No Nama Bulan Jumlah Hari
1 Muharram 30
2 Safar 29
3 Rabi'ul Awal 30
4 Rabi'ul Akhir 29
5 Jumadil Awal 30
6 Jumadil Akhir 29
7 Rajab 30
8 Sya'ban 29
9 Ramadhan 30
10 Syawal 29
11 Dzulka'dah 30
12 Dzulhijah 29/30

Jumlah hari dalam satu tahun Hijriyah adalah 354 Hari atau 355 Hari apabila tahun tersebut merupakan tahun kabisat.

Biasanya tahun hijriyah dikelompokkan dalam satu daur, dimana satu daur Hijriyah terdiri dari 30 Tahun, dimana dalam 1 Daur tersebut, urutan dari tahun ke : 2,5,7,10,13,15,18,21,24,26,29 merupakan Tahun kabisat, hal ini berbeda dengan Tahun Masehi yang mana Tahun Kabisat adalah 4 Tahun sekali. Karena Daur ini berpola, sehingga bisa Kita hitung 1 Daur Hijriyah terdiri dari 10631 Hari.

Karena ini berhubungan dengan Tanggal Masehi, maka kita juga perlu lihat pola Masehi. 1 Daur Masehi terdiri dari 4 Tahun, dimana jumlah hari dalam 1 Daur Masehi adalah sebanyak 1461 hari dengan detil 1 Tahun terdiri dari 364 Hari atau 365 Hari apabila tahun tersebut Kabisat.

Selanjutnya, selisih jumlah hari Tahun Masehi dan Tahun Hijriyah adalah 227016 Hari dikarenakan 1 Muharram 1 H bertepatan dengan 16 Juli 622 M yang apabila dihitung dari 1 Januari 1 M sampai 16 Juli 622 M adalah sekitar 227016 Hari yang menjadi selisih dari kedua Tahun tersebut

Lalu ada lagi yang namanya Anggaran Gregorius yang berjumlah 13 Hari (ini Saya jujur kurang tau) kalau ada yang tau, bisa komen ya.

Oke kita langsung aja persiapan untuk melakukan penentuan Hari dan Jam Ijtima

Untuk membuat script ini kita lebih install lebih dulu library yang dibutuhkan, yaitu NumPy dan Pyephem

NumPy merupakan Library yang sudah tidak asing lagi karena seringkali digunakan untuk komputasi numerik dalam Python, sedangkak Pyephem merupakan library yang mengimplementasikan Algoritma Astronomi dalam Bahasa Python, karena kita akan menggunakan beberapa perhitungan astronomi dalam tutorial ini.

untuk Install, silahkan ketikkan command dibawah ini

pip install numpy pyephem

Menghitung Perkiraan Hari

Langkah - langkah yang akan kita lakukan adalah sebagai berikut :

1. Input H-1 Hari yang kita inginkan

Apabila kita ingin menentukan 1 Ramadhan 1441H, maka Kita akan melakukan perhitungan pada 29 Sya'ban 1441 H atau 29-08-1441

2 . Uraikan Tanggal menjadi Satuan Waktu

Misal 29-08-1441, maka ini sama dengan : 1440 Tahun lebih 7 Bulan 29 Hari

Stage ini Saya namakan normalisasi Tanggal, kita buat fungsi berikut dengan parameter berupa String dengan format dd-mm-yyyy dalam Hijriyah:

def normalize_tgl(string):
    data = string.split('-')
    data = list(map(lambda x : int(x), data))
    if tgl_valid(data):
        if data[1] != 1:
            data = [data[-1] - 1, data[-2] - 1, data[0]]
        else:
            data = [data[-1] - 2,  12 , data[0]]
        return data

3. Hitung Daur Tahun Hijriyah*

Dari keterangan diatas bahwa 1 Daur terdiri dari 30 Tahun sehingga: 1440 Tahun lebih 7 Bulan 29 Hari diubah menjadi 48 Daur 0 Tahun 7 Bulan 29 Hari

dengan input dari fungsi sebelumnya kita buat fungsi berikut :

def add_daur(data):
    data = [data[0] // 30, data[0] % 30, data[1], data[2]]
    return data

4. Konversi ke Jumlah Hari

Dengan informasi yang sudah dijabarkan diatas, maka kita bisa menghitung dengan formulasi berikut :

  • Jumlah Daur dikali 10631

  • Jumlah tahun dikali 364

  • lihat jumlah tahun, lalu lihat tabel kabisat, ada berapa jumlah tahun kabisat yang telah dilewati, jumlahkan satu tahun satu hari

  • Jumlah bulan dikali 30 atau 29 (jumlah hari hijriyah)

  • Jumlah hari sisa, dijumlahkan kesana

  • Jumlahkan dengan selisih Masehi-Hijriyah (227016)

  • Jumlahkan dengan Anggaran Baru Gregorius

Sebagai Contoh : 48 Daur, 0 Tahun, 8 Bulan, 29 Hari 48 dikali 10631 menghasilkan 510228 Hari .... (A)

0 dikali 364 menghasilkan 0 ... (B)

0 Tahun berarti ada 0 tahun Kabisat, sehingga menghasilkan 0 ... (C)

8 Bulan terdiri dari 4 Bulan 30 hari dan 3 Bulan 29 hari sehingga : (430) + (329) menghasilkan 207 hari .. (D)

Sisa hari 29 Hari ... (E)

Selisih Masehi-Hijriyah 227016 Hari ...(F)

Anggaran baru Gregorius 13 Hari (G)

Sehingga : A + B + C + D + E + F + G = 510288 + 0 + 0 + 207 + 29 + 227016 + 13 = 737553 Hari

5. Konversi ke Masehi

Dengan jumlah hari yang sudah dihitung, kita konversikan kedalam Masehi, langkah yang perlu dilakukan adalah sebagai berikut

  • Bagi jumlah hari dengan 1461 (1 siklus) lalu ambil bilangan bulatnya saja

  • Kalikan hasil perhitungan diatas dengan 4 (menjadi satuan tahun)

  • Untuk menghitung sisa hari, lakukan operasi modulus antara jumlah keseluruhan hari dengan 1461

  • Hasil perhitungan diatas dimoduluskan dengan 365 untuk mendapatkan sisa tahun yang belum masuk 1 siklus atau daur

  • lakukan hal yang sama untuk bulan dan hari

Sebagai contoh, kita masukkan data 737553 Hari, maka

Hasil pembagian antara 737553 dengan 1461 adalah 504

504 dikalikan dengan 4 adalah 2016 ... (A)

Untuk sisa hari, lakukan mod(737553, 1461) menghasilkan 1209 Hari

1209 Hari dibagi dengan 365 menghasilkan 3 , sehingga Jumlah tahun adalah (A) + 3 = 2016 + 3 = 2019 Tahun

Sisa hari yang tidak termasuk dalam 3 tahun diatas adalah mod(1209, 365) yaitu 114 hari

114 Hari diatas, dibagi dengan 30 untuk melihat jumlah bulan , didapat 3 Bulan

lalu sisa hari terakhir adalah mod(114, 30) = 24 Hari

sehingga didapatkan

2019 Tahun lebih 3 Bulan 24 Hari yang artinya adalah : 24 April 2020 Ini adalah Tanggal perkiraan yang didapatkan.

Video Simulasi Hisab 1

Menghitung Jam Ijtima

Selanjutnya, setelah mendapat tanggal perkiraan, kita akan menentukan Jam Ijtima, yaitu jam saat Bumi dan Bulan berada di posisi bujur langit yang sama

Langkah-langkah untuk memperkirakan waktu Ijtima adalah sebagai berikut :

  • Cari Fraction Illumination Bulan terkecil pada hari tersebut, Anda dapat mencarinya di situs web http://falakiyah.nu.or.id/EphemerisBulan.aspx atau sumber lain yang berkaitan dengan Data Ephemiris Bulan (per jam). Karena Saya tidak mau repot, Kita akan menggunakan Library Pyephem untuk hal ini. Apabila anda menemukan FIB terkecil pada pukul 00 atau 01, maka anda perlu mencarinya di hari sebelumnya

  • Selanjutnya cari Apparent Longitude Bulan (ALB) dan Ecliptic Longitude Matahari (ELM) pada jam dan tanggal FIB terkecil, ambil juga data sejam setelahnya untuk melihat kecepatan pergerakan Bulan dan Matahari

  • Hitung Selisih Bujur (SB) dengan formula : |ELM(j) - ALB(j)| dimana j adalah jam FIB terkecil

  • Hitung Kecepatan Matahari (KM) dengan formula : |ELM(j) - ELM(j+1)| dimana j adalah jam FIB terkecil

  • Hitung Kecepatan Bulan (KB) dengan formula : |ALB(j) - ALB(j+1)|dimana j adalah jam FIB terkecil

  • Hitung Selisih Kecepatan (SK) dengan formula : |KM - KB|

  • Hitung Ijtima dengan formula : Jam FIB + (SB/SK) + Zona Waktu

Catatan : Karena kita perlu mengkonversi sudut bujur ke satuan waktu, gunakan snippet berikut :

def decdeg2dms(dd):
   is_positive = dd >= 0
   dd = abs(dd)
   minutes,seconds = divmod(dd*3600,60)
   degrees,minutes = divmod(minutes,60)
   degrees = degrees if is_positive else -degrees
   return (degrees,minutes,seconds)

Video Simulasi Hisab 2

Untuk mengakses keseluruhan kode simulasi Hisab dengan Python, silahkan klik link Notebook Simulasi Hisab

Semoga bermanfaat, apabila ada komentar, atau koreksi, silahkan komen dibawah


CARI

Afif A.I

Halo, saya Afif.
Semoga platform NgodingPython.com menjadi sarana untuk berbagi lebih luas