Sebagai Seorang muslim Shalat merupakan suatu kewajiban. Shalat merupakan rukun Islam yang ke-2, seperti tertera dalam riwayat berikut yang saya kopi dari sini. Dari ‘Abdullah bin ’Umar radhiyallahu ’anhuma, Rasulullah shallallahu ’alaihi wa sallam bersabda,
بُنِىَ الإِسْلاَمُ عَلَى خَمْسٍ شَهَادَةِ أَنْ لاَ إِلَهَ إِلاَّ اللَّهُ وَأَنَّ مُحَمَّدًا عَبْدُهُ وَرَسُولُهُ وَإِقَامِ الصَّلاَةِ وَإِيتَاءِ الزَّكَاةِ وَحَجِّ الْبَيْتِ وَصَوْمِ رَمَضَانَ
“Islam dibangun atas lima perkara, yaitu : (1) bersaksi bahwa tidak ada sesembahan yang benar untuk diibadahi kecuali Allah dan bersaksi bahwa Muhammad adalah utusan-Nya, (2) mendirikan shalat, (3) menunaikan zakat, (4) naik haji ke Baitullah -bagi yang mampu-, (5) berpuasa di bulan Ramadhan.” (HR. Bukhari no. 8 dan Muslim no. 16).
Pada kesempatan kali ini. Saya akan mencoba membahas sedikit tentang definisi waktu sholat dan contoh penerapannya untuk daerah Lund Swedia. Saya juga akan menyertakan code python untuk menghitung waktu sholat. Berikut merupakan pedoman waktu sholat yang saya ambil dari praytimes.org.
Metode perhitungan secara rinci dapat dilihat pada tautan link berikut. Di lain kesempatan akan saya tulis. Tidak seperti Indonesia yang berada di khatulistiwa, lamanya siang dan malam pada negara-negara 4 musim tidak selalu sama, hal ini disebakan oleh gerak semu matahari tahunan yang merupakan konsekuensi dari revolusi Bumi. Akibatnya, waktu shalat di negara 4 musim berubah-ubah tergantung kepada gerak semua matahari tersebut. Berikut adalah contoh waktu sholat Maghrib selama 1 tahun di Lund, Swedia. Kordinat kota Lund adalah sebagai berikut Latitude: 55,7074 Longitude: 13,1971 dan perbedaan waktu dengan GMT bergantung kepada tanggal. Pada
Gambar 1. Waktu Sholat Maghrib Selama 1 Tahun di Lund, Swedia.
Waktu Sholat Maghrib tercepat di Lund adalah 15:34 di akhir bulan Desember dan 21:56 di akhir bulan Juni, seperti terlihat pada Gambar 1. Tidak seperti di Lund yang memilki waktu maghrib berubah secara dramatis sebagai fungsi waktu, Jakarta memiliki waktu sholat maghrib yang relatif idak berubah secara drastis. Berikut adalah waktu sholat maghrib di Jakarta.
Gambar 2. Waktu Sholat Maghrib di Jakarta, Indonesia.
Di Jakarta, waktu sholat maghrib tercepat terjadi pada Bulan November yaitu 17:40 dan terlama pada bulan Juli, yaitu 18:20. Perbedaan waktu sholat maghrib terlama dan tercepat hanya 40 menit, sehingga tidak terlalu besar dibandingkan dengan perbedaan yang sama di Lund.
Code perhitungan waktu sholat, class nya saya peroleh dari sini (http://praytimes.org/code/) lalu saya buatkan looping untuk mendapatkan perhitungan selama 1 tahun.
import math
import re</pre>
'''
--------------------- Copyright Block ----------------------
praytimes.py: Prayer Times Calculator (ver 2.3)
Copyright (C) 2007-2011 PrayTimes.org
Python Code: Saleem Shafi, Hamid Zarrabi-Zadeh
Original js Code: Hamid Zarrabi-Zadeh
License: GNU LGPL v3.0
TERMS OF USE:
Permission is granted to use this code, with or
without modification, in any website or application
provided that credit is given to the original work
with a link back to PrayTimes.org.
This program is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY.
PLEASE DO NOT REMOVE THIS COPYRIGHT BLOCK.
--------------------- Help and Manual ----------------------
User's Manual:
http://praytimes.org/manual
Calculation Formulas:
http://praytimes.org/calculation
------------------------ User Interface -------------------------
getTimes (date, coordinates, timeZone [, dst [, timeFormat]])
setMethod (method) // set calculation method
adjust (parameters) // adjust calculation parameters
tune (offsets) // tune times by given offsets
getMethod () // get calculation method
getSetting () // get current calculation parameters
getOffsets () // get current time offsets
------------------------- Sample Usage --------------------------
>>> PT = PrayTimes('ISNA')
>>> times = PT.getTimes((2011, 2, 9), (43, -80), -5)
>>> times['sunrise']
07:26
'''
#----------------------- PrayTimes Class ------------------------
class PrayTimes():
#------------------------ Constants --------------------------
# Time Names
timeNames = {
'imsak' : 'Imsak',
'fajr' : 'Fajr',
'sunrise' : 'Sunrise',
'dhuhr' : 'Dhuhr',
'asr' : 'Asr',
'sunset' : 'Sunset',
'maghrib' : 'Maghrib',
'isha' : 'Isha',
'midnight' : 'Midnight'
}
# Calculation Methods
methods = {
'MWL': {
'name': 'Muslim World League',
'params': { 'fajr': 18, 'isha': 17 } },
'ISNA': {
'name': 'Islamic Society of North America (ISNA)',
'params': { 'fajr': 15, 'isha': 15 } },
'Egypt': {
'name': 'Egyptian General Authority of Survey',
'params': { 'fajr': 19.5, 'isha': 17.5 } },
'Makkah': {
'name': 'Umm Al-Qura University, Makkah',
'params': { 'fajr': 18.5, 'isha': '90 min' } }, # fajr was 19 degrees before 1430 hijri
'Karachi': {
'name': 'University of Islamic Sciences, Karachi',
'params': { 'fajr': 18, 'isha': 18 } },
'Tehran': {
'name': 'Institute of Geophysics, University of Tehran',
'params': { 'fajr': 17.7, 'isha': 14, 'maghrib': 4.5, 'midnight': 'Jafari' } }, # isha is not explicitly specified in this method
'Jafari': {
'name': 'Shia Ithna-Ashari, Leva Institute, Qum',
'params': { 'fajr': 16, 'isha': 14, 'maghrib': 4, 'midnight': 'Jafari' } }
}
# Default Parameters in Calculation Methods
defaultParams = {
'maghrib': '0 min', 'midnight': 'Standard'
}
#---------------------- Default Settings --------------------
calcMethod = 'MWL'
# do not change anything here; use adjust method instead
settings = {
"imsak" : '10 min',
"dhuhr" : '0 min',
"asr" : 'Standard',
"highLats" : 'NightMiddle'
}
timeFormat = '24h'
timeSuffixes = ['am', 'pm']
invalidTime = '-----'
numIterations = 1
offset = {}
#---------------------- Initialization -----------------------
def __init__(self, method = "MWL") :
# set methods defaults
for meth, config in self.methods.items():
for name, value in self.defaultParams.items():
if not name in config['params'] or config['params'][name] is None:
config['params'][name] = value
# initialize settings
self.calcMethod = method if method in self.methods else 'MWL'
params = self.methods[self.calcMethod]['params']
for name, value in params.items():
self.settings[name] = value
# init time offsets
for name in self.timeNames:
self.offset[name] = 0
#-------------------- Interface Functions --------------------
def setMethod(self, method):
if method in self.methods:
self.adjust(self.methods[method].params)
self.calcMethod = method
def adjust(self, params):
self.settings.update(params)
def tune(self, timeOffsets):
self.offsets.update(timeOffsets)
def getMethod(self):
return self.calcMethod
def getSettings(self):
return self.settings
def getOffsets(self):
return self.offset
def getDefaults(self):
return self.methods
# return prayer times for a given date
def getTimes(self, date, coords, timezone, dst = 0, format = None):
self.lat = coords[0]
self.lng = coords[1]
self.elv = coords[2] if len(coords)>2 else 0
if format != None:
self.timeFormat = format
if type(date).__name__ == 'date':
date = (date.year, date.month, date.day)
self.timeZone = timezone + (1 if dst else 0)
self.jDate = self.julian(date[0], date[1], date[2]) - self.lng / (15 * 24.0)
return self.computeTimes()
# convert float time to the given format (see timeFormats)
def getFormattedTime(self, time, format, suffixes = None):
if math.isnan(time):
return self.invalidTime
if format == 'Float':
return time
if suffixes == None:
suffixes = self.timeSuffixes
time = self.fixhour(time+ 0.5/ 60) # add 0.5 minutes to round
hours = math.floor(time)
minutes = math.floor((time- hours)* 60)
suffix = suffixes[ 0 if hours < 12 else 1 ] if format == '12h' else ''
formattedTime = "%02d:%02d" % (hours, minutes) if format == "24h" else "%d:%02d" % ((hours+11)%12+1, minutes)
return formattedTime + suffix
#---------------------- Calculation Functions -----------------------
# compute mid-day time
def midDay(self, time):
eqt = self.sunPosition(self.jDate + time)[1]
return self.fixhour(12 - eqt)
# compute the time at which sun reaches a specific angle below horizon
def sunAngleTime(self, angle, time, direction = None):
try:
decl = self.sunPosition(self.jDate + time)[0]
noon = self.midDay(time)
t = 1/15.0* self.arccos((-self.sin(angle)- self.sin(decl)* self.sin(self.lat))/
(self.cos(decl)* self.cos(self.lat)))
return noon+ (-t if direction == 'ccw' else t)
except ValueError:
return float('nan')
# compute asr time
def asrTime(self, factor, time):
decl = self.sunPosition(self.jDate + time)[0]
angle = -self.arccot(factor + self.tan(abs(self.lat - decl)))
return self.sunAngleTime(angle, time)
# compute declination angle of sun and equation of time
# Ref: http://aa.usno.navy.mil/faq/docs/SunApprox.php
def sunPosition(self, jd):
D = jd - 2451545.0
g = self.fixangle(357.529 + 0.98560028* D)
q = self.fixangle(280.459 + 0.98564736* D)
L = self.fixangle(q + 1.915* self.sin(g) + 0.020* self.sin(2*g))
R = 1.00014 - 0.01671*self.cos(g) - 0.00014*self.cos(2*g)
e = 23.439 - 0.00000036* D
RA = self.arctan2(self.cos(e)* self.sin(L), self.cos(L))/ 15.0
eqt = q/15.0 - self.fixhour(RA)
decl = self.arcsin(self.sin(e)* self.sin(L))
return (decl, eqt)
# convert Gregorian date to Julian day
# Ref: Astronomical Algorithms by Jean Meeus
def julian(self, year, month, day):
if month portion:
time = base + (-portion if direction == 'ccw' else portion)
return time
# the night portion used for adjusting times in higher latitudes
def nightPortion(self, angle, night):
method = self.settings['highLats']
portion = 1/2.0 # midnight
if method == 'AngleBased':
portion = 1/60.0 * angle
if method == 'OneSeventh':
portion = 1/7.0
return portion * night
# convert hours to day portions
def dayPortion(self, times):
for i in times:
times[i] /= 24.0
return times
#---------------------- Misc Functions -----------------------
# compute the difference between two times
def timeDiff(self, time1, time2):
return self.fixhour(time2- time1)
# convert given string into a number
def eval(self, st):
val = re.split('[^0-9.+-]', str(st), 1)[0]
return float(val) if val else 0
# detect if input contains 'min'
def isMin(self, arg):
return isinstance(arg, str) and arg.find('min') > -1
#----------------- Degree-Based Math Functions -------------------
def sin(self, d): return math.sin(math.radians(d))
def cos(self, d): return math.cos(math.radians(d))
def tan(self, d): return math.tan(math.radians(d))
def arcsin(self, x): return math.degrees(math.asin(x))
def arccos(self, x): return math.degrees(math.acos(x))
def arctan(self, x): return math.degrees(math.atan(x))
def arccot(self, x): return math.degrees(math.atan(1.0/x))
def arctan2(self, y, x): return math.degrees(math.atan2(y, x))
def fixangle(self, angle): return self.fix(angle, 360.0)
def fixhour(self, hour): return self.fix(hour, 24.0)
def fix(self, a, mode):
if math.isnan(a):
return a
a = a - mode * (math.floor(a / mode))
return a + mode if a 82 and count < 301):
times = prayTimes.getTimes(dates, (6.1805, 106.8283), +7);
else:
times = prayTimes.getTimes(dates, (6.1805, 106.8283), +7);
# print(times['fajr'])
count += 1
hari[count] = day
shubuh[count] = times['fajr']
zhuhur[count] = times['dhuhr']
ashar[count] = times['asr']
maghrib[count] = times['maghrib']
isya[count] = times['isha']
# simpan = pd.DataFrame.from_dict(shubuh)
df0 = pd.DataFrame([hari]).astype('datetime64[ns]')
# pd.to_datetime(df0)
df1 = pd.DataFrame([shubuh]).astype('datetime64[ns]')
df2 = pd.DataFrame([zhuhur]).astype('datetime64[ns]')
df3 = pd.DataFrame([ashar]).astype('datetime64[ns]')
df4 = pd.DataFrame([maghrib]).astype('datetime64[ns]')
df5 = pd.DataFrame([isya]).astype('datetime64[ns]')
df = df0.append([df1,df2,df3,df4,df5])
df = df.T
df.columns = ["Tanggal", "Shubuh", "Zuhur", "Ashar","Maghrib","Isya"]
df['Tanggal'] = pd.to_datetime(df['Tanggal']).dt.date
df['Shubuh'] = pd.to_datetime(df['Shubuh'],format= '%H:%M:%S' ).dt.time
df['Zuhur'] = pd.to_datetime(df['Zuhur'],format= '%H:%M:%S' ).dt.time
df['Ashar'] = pd.to_datetime(df['Ashar'],format= '%H:%M:%S' ).dt.time
df['Maghrib'] = pd.to_datetime(df['Maghrib'],format= '%H:%M:%S' ).dt.time
df['Isya'] = pd.to_datetime(df['Isya'],format= '%H:%M:%S' ).dt.time
writer = pd.ExcelWriter('Jakarta_shalat.xlsx')
df.to_excel(writer,'Sheet1')
### update.to_excel(writer, "Here", startrow=1, startcol=2)
writer.save()
### u = dpd.to_datetime(df0)
# print(df1.dtypes)
# plt.plot(df['Tanggal'],df['Shubuh'],'x')
# plt.plot(df['Tanggal'],df['Zuhur'])
# plt.plot(df['Tanggal'],df['Ashar'])
plt.plot(df['Tanggal'],df['Maghrib'])
# plt.plot(df['Tanggal'],df['Isya'])
plt.show()
Apabila tampilan code tersebut tidak dapat dikopi, sedangkan anda membutuhkannya, silahkan tulis alamat email anda.
Salam,
Syahril