menghitung waktu sholat dengan java

Menghitung Waktu Sholat dengan Java


Bismillah

Kali ini izinkan saya untuk sedikit berbagi potongan kode program dalam bahasa Java untuk menghitung waktu sholat (sholat wajib lima waktu), berlaku untuk tanggal pada saat perhitungan (current date). Siapa tahu ada yang membutuhkan, baik itu dimanfaatkan sebagai bagian dari pengembangan aplikasi, keperluan penelitian, atau hanya sekadar kepo belaka. Bebas. Yang penting bermanfaat untuk kebaikan.

Bagi yang belum ngeh mengapa waktu sholat itu kok beda-beda di setiap daerah. Sudah gitu pake ada perhitungannya segala lagi. Ya… karena aturan yang diajarkan oleh Allah memang begitu. Salah satunya dapat dilihat pada ayat berikut, “Sesungguhnya shalat itu adalah fardhu yang ditentukan waktunya atas orang-orang yang beriman.” (QS An-Nisa 103). Di ayat yang lain juga ada, “Dirikanlah shalat dari sesudah matahari tergelincir sampai gelap malam dan (dirikanlah pula shalat) subuh. Sesungguhnya shalat subuh itu disaksikan (oleh malaikat).” (QS Al-Isra 78). Dan beberapa dasar hukum lainnya yang dapat dibaca di sini. Cukup jelas. Cukup lengkap penjelasannya. Sehingga hal ini juga sekaligus menjawab anggapan-anggapan miring kalau Islam itu identik dengan konsep bumi datar (flat earth atau FE). Bukan ya bro. Islam ya Islam. FE ya FE. Jangan lantas membuat tuduhan tak mendasar kalau orang Islam itu PASTI menganggap bahwa bumi itu tidak bulat. Yuk mari saling beritikad baik dan terbuka. Boleh kok mengkaji dari sisi manapun, baik secara keilmuan eksakta ataupun berdasar literatur sejarah. 🙂

OK, kembali ke hitung menghitung waktu sholat. Secuil kode program yang saya tulis ini sebenarnya tidak 100% saya buat dari awal. Bahkan mungkin boleh dibilang hanya menjiplak atau istilah yang agak ndeso-nya biasanya disebut porting. Lha wong judulnya saja mirip. Ga kreatif blasss memang. Percayalah, otak saya sudah terlalu tua untuk berpikir algoritma yang melibatkan banyak parameter seperti ini, apalagi pake formula perhitungan matematis yang ruwet wal njelimet. Jadi, saya modif saja dari kode program yang sudah ada, yang rupanya masih menggunakan bahasa PHP. Tapi, bukan PHP yang itu ya. Paham kan maksud saya. 😀 Ini lho… bisa dibaca di sini.

Dan ini yang versi modifan ala-ala menggunakan bahasa Java Timuran. Cekidot gan:


/* 	Andik Taufiq
	2017-09-28
	*/

import java.util.Date;
import java.util.Calendar;
	
public class PrayerTimes {
	
	public static final int TYPE_SUBH		= 1;
	public static final int TYPE_FAJR		= 2;
	public static final int TYPE_ZUHR		= 3;
	public static final int TYPE_ASHR		= 4;
	public static final int TYPE_MAGHRIB	= 5;
	public static final int TYPE_ISYA		= 6;
	
	public static double ELEVATION = 832;	// Elevation (meter)
	public static double DTA = 	19.5; 		// Dawn’s Twilight Angle
	public static double NTA = 18.7;		// Night’s Twilight Angle
	public static double LAT = -6.89;		// Latitude (Degrees)
	public static double LONG = 107.67;		// Longitude (Degrees)
	public static double TZ = 7;			// Time Zone (Hours)
	public static int MAHZAB = 1; 			// 1 (Shafii); 2 (Hanafi)
	
	public static double SD = 0;    // Solar Declination (derajat)
	public static double ET = 0;    // Equation of times (minutes)
	public static double RL = 0;    // Reference Longitude (Degrees)
	
	public static double sign(double x) {
		if(x == 0)
			return 0;
		else
			return x / (Math.abs(x));
	}
	
	public static String prayerTime(int prayType) {
		String temp = "";
		Date date = new Date();
		Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
		int yDay = calendar.get(Calendar.DAY_OF_YEAR)-1;
		double beta = 2 * Math.PI * yDay / 365;
		SD = (180 / Math.PI) * (0.006918 - (0.399912 * Math.cos(beta)) + (0.070257 * Math.sin(beta)) - (0.006758 * Math.cos(2 * beta)) + (0.000907 * Math.sin(2 * beta)) - (0.002697 * Math.cos(3 * beta)) + (0.001480 * Math.sin(3 * beta)));
		ET = 229.18 * (0.000075 + (0.001868 * Math.cos(beta)) - (0.032077 * Math.sin(beta)) - (0.014615 * Math.cos(2 * beta)) - (0.040849 * Math.sin(2 * beta)));
		RL = 15 * TZ;
		double Z = 12 + ((RL - LONG) / 15) - (ET / 60);
		double U = (180 / (15 * Math.PI)) * Math.acos((Math.sin((-0.8333 - 0.0347 * sign(ELEVATION) * Math.sqrt(Math.abs(ELEVATION))) * (Math.PI / 180)) - Math.sin(SD * (Math.PI / 180)) * Math.sin(LAT * (Math.PI / 180))) / (Math.cos(SD * (Math.PI / 180)) * Math.cos(LAT * (Math.PI / 180))));
		double Vd = (180 / (15 * Math.PI)) * Math.acos((-Math.sin(DTA * (Math.PI / 180)) - Math.sin(SD * (Math.PI / 180)) * Math.sin(LAT * (Math.PI / 180))) / (Math.cos(SD * (Math.PI / 180)) * Math.cos(LAT * (Math.PI / 180))));
		double Vn = (180 / (15 * Math.PI)) * Math.acos((-Math.sin(NTA * (Math.PI / 180)) - Math.sin(SD * (Math.PI / 180)) * Math.sin(LAT * (Math.PI / 180))) / (Math.cos(SD * (Math.PI / 180)) * Math.cos(LAT * (Math.PI / 180))));
		double W = (180 / (15 * Math.PI)) * Math.acos((Math.sin(Math.atan(1 / (MAHZAB + Math.tan(Math.abs(LAT - SD) * Math.PI / 180))))-Math.sin(SD * Math.PI / 180) * Math.sin(LAT * Math.PI / 180)) / (Math.cos(SD * Math.PI / 180) * Math.cos(LAT * Math.PI / 180)));
		double res = 0;
		switch (prayType) {
			case TYPE_SUBH:
				res = Z-Vd;
				temp = "SUBUH" + "\t\t";
			break;
			case TYPE_FAJR:
				res = Z-U;
				temp = "FAJAR" + "\t\t";
			break;
			case TYPE_ZUHR:
				res = Z;
				temp = "ZUHUR" + "\t\t";
			break;
			case TYPE_ASHR:
				res = Z+W;
				temp = "ASHAR" + "\t\t";
			break;
			case TYPE_MAGHRIB:
				res = Z+U;
				temp = "MAGHRIB" + "\t\t";
			break;
			case TYPE_ISYA:
				res = Z+Vn;
				temp = "ISYA" + "\t\t";
			break;
		}
		int jam = (int) Math.floor(res);
		int menit = (int) Math.floor((res - jam) * 60);
		int detik = (int) Math.floor((((res - jam) * 60) - menit) * 60);
		if (jam <= 9)
			temp = temp + "0" + jam;
		else
			temp = temp + jam;
		if (menit <= 9)
			temp = temp + ":" + "0" + menit;
		else 
			temp = temp + ":" + menit;
		if (detik <= 9)
			temp = temp + ":" + "0" + detik;
		else 
			temp = temp + ":" + detik;
		return temp;
	}
	
	public static void main(String args[]) {
		System.out.println(prayerTime(1));
		System.out.println(prayerTime(2));
		System.out.println(prayerTime(3));
		System.out.println(prayerTime(4));
		System.out.println(prayerTime(5));
		System.out.println(prayerTime(6));
	}
}

Lokasi untuk sementara saya set secara hard code menggunakan longitude latitude daerah Bandung Timur dengan ketinggian 832 meter di atas permukaan laut. Kalau mau diset menggunakan parameter yang dinamis sesuai pembacaan GPS dan altimeter dari si device, monggo silakan disesuaikan saja.

Sehingga kalau program di atas dijalankan, kira-kira begini keluarannya.

menghitung waktu sholat dengan java

Saya sudah mencoba beberapa kali dengan kombinasi konstanta, terutama yang sudut subuh (DTA) dan sudut isya’ (NTA). Ternyata hasilnya tak jauh beda, 11 12 dengan waktu sholat yang dihasilkan dari beberapa aplikasi yang ada di Google Play, seperti Salaam, Muslim Pro, dll. Beti, beda tipis sekitar 1 sampai 2 menitan. Semoga angka ini masih dalam tahap kewajaran dalam perhitungan.

Bagi yang masih berjiwa muda dan penasaran mengapa perhitungannya kok begini dan begitu, bisa dicoba baca-baca dari referensi yang ada di sini. Penjelasannya lumayan runut menurut saya walapun ada beberapa bagian yang berbeda dari kode program di atas dalam hal penggunaan konstanta. Justru itu saya pribadi butuh koreksinya. Barangkali ada yang salah, baik formulanya maupun kesalahan teknis penulisannya.

Please, correct me if I’m wrong ya… Semoga bermanfaat!!

Advertisements

2 thoughts on “Menghitung Waktu Sholat dengan Java

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.