Source for file Salat.php
Documentation is available at Salat.php
* ----------------------------------------------------------------------
* Copyright (c) 2006-2016 Khaled Al-Sham'aa
* ----------------------------------------------------------------------
* This program is open source product; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License (LGPL)
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/lgpl.txt>.
* ----------------------------------------------------------------------
* Class Name: Muslim Prayer Times
* Original Author(s): Khaled Al-Sham'aa <khaled@ar-php.org>
* Purpose: The five Islamic prayers are named Fajr, Zuhr, Asr, Maghrib
* and Isha. The timing of these five prayers varies from place
* to place and from day to day. It is obligatory for Muslims
* to perform these prayers at the correct time.
* ----------------------------------------------------------------------
* Source: http://qasweb.org/qasforum/index.php?showtopic=177&st=0
* By: Mohamad Magdy <mohamad_magdy_egy@hotmail.com>
* ----------------------------------------------------------------------
* Using this PHP Class you can calculate the time of Muslim prayer
* according to the geographic location.
* The five Islamic prayers are named Fajr, Zuhr, Asr, Maghrib and Isha. The timing
* of these five prayers varies from place to place and from day to day. It is
* obligatory for Muslims to perform these prayers at the correct time.
* The prayer times for any given location on earth may be determined mathematically
* if the latitude and longitude of the location are known. However, the theoretical
* determination of prayer times is a lengthy process. Much of this tedium may be
* alleviated by using computer programs.
* Definition of prayer times
* - FAJR starts with the dawn or morning twilight. Fajr ends just before sunrise.
* - ZUHR begins after midday when the trailing limb of the sun has passed the
* meridian. For convenience, many published prayer timetables add five minutes to
* mid-day (zawal) to obtain the start of Zuhr. Zuhr ends at the start of Asr time.
* - The timing of ASR depends on the length of the shadow cast by an object.
* According to the Shafi school of jurisprudence, Asr begins when the length of
* the shadow of an object exceeds the length of the object. According to the
* Hanafi school of jurisprudence, Asr begins when the length of the shadow
* exceeds TWICE the length of the object. In both cases, the minimum length of
* shadow (which occurs when the sun passes the meridian) is subtracted from the
* length of the shadow before comparing it with the length of the object.
* - MAGHRIB begins at sunset and ends at the start of isha.
* - ISHA starts after dusk when the evening twilight disappears.
* date_default_timezone_set('UTC');
* include('./I18N/Arabic.php');
* $obj = new I18N_Arabic('Salat');
* $obj->setLocation(33.513,36.292,2);
* $obj->setDate(date('j'), date('n'), date('Y'));
* $times = $obj->getPrayTime();
* echo '<b>Damascus, Syria</b><br />';
* echo date('l F j, Y').'<br /><br />';
* echo "<b class=hilight>Imsak:</b> {$times[8]}<br />";
* echo "<b class=hilight>Fajr:</b> {$times[0]}<br />";
* echo "<b class=hilight>Sunrise:</b> {$times[1]}<br />";
* echo "<b class=hilight>Zuhr:</b> {$times[2]}<br />";
* echo "<b class=hilight>Asr:</b> {$times[3]}<br />";
* echo "<b class=hilight>Sunset:</b> {$times[6]}<br />";
* echo "<b class=hilight>Maghrib:</b> {$times[4]}<br />";
* echo "<b class=hilight>Isha:</b> {$times[5]}<br />";
* echo "<b class=hilight>Midnight:</b> {$times[7]}<br />";
* Qibla Determination Methods - Basic Spherical Trigonometric Formula
* The problem of qibla determination has a simple formulation in spherical
* trigonometry. A is a given location, K is the Ka'ba, and N is the North Pole.
* The great circle arcs AN and KN are along the meridians through A and K,
* respectively, and both point to the north. The qibla is along the great circle
* arc AK. The spherical angle q = NAK is the angle at A from the north direction
* AN to the direction AK towards the Ka'ba, and so q is the qibla bearing to be
* computed. Let F and L be the latitude and longitude of A, and FK and LK be
* the latitude and longitude of K (the Ka'ba). If all angles and arc lengths
* are measured in degrees, then it is seen that the arcs AN and KN are of measure
* 90 - F and 90 - FK, respectively. Also, the angle ANK between the meridians
* of K and A equals the difference between the longitudes of A and K, that is,
* LK - L, no matter what the prime meridian is. Here we are given two sides and
* the included angle of a spherical triangle, and it is required to determine one
* other angle. One of the simplest solutions is given by the formula:
* q = tan ------------------------------------------
* cos F tan FK - sin F cos(LK - L)
* In this Equation, the sign of the input quantities are assumed as follows:
* latitudes are positive if north, negative if south; longitudes are positive
* if east, negative if west. The quadrant of q is assumed to be so selected
* that sin q and cos q have the same sign as the numerator and denominator of
* this Equation. With these conventions, q will be positive for bearings east
* of north, negative for bearings west of north.
* The Correct Qibla, S. Kamal Abdali <k.abdali@acm.org>
* PDF version in http://www.patriot.net/users/abdali/ftp/qibla.pdf
* date_default_timezone_set('UTC');
* include('./I18N/Arabic.php');
* $obj = new I18N_Arabic('Salat');
* $obj->setLocation(33.513,36.292,2);
* $direction = $obj->getQibla();
* echo "<b>Qibla Direction (from the north direction):</b> $direction<br />";
* @author Khaled Al-Sham'aa <khaled@ar-php.org>
* @copyright 2006-2016 Khaled Al-Sham'aa
* @license LGPL <http://www.gnu.org/licenses/lgpl.txt>
* @link http://www.ar-php.org
* This PHP class calculate the time of Muslim prayer according to the geographic
* @author Khaled Al-Sham'aa <khaled@ar-php.org>
* @copyright 2006-2016 Khaled Al-Sham'aa
* @license LGPL <http://www.gnu.org/licenses/lgpl.txt>
* @link http://www.ar-php.org
* خط الطول الجغرافى للمكان
protected $long = 37.15861;
protected $lat = 36.20278;
protected $elevation = 0;
protected $AB2 = - 0.833333;
protected $school = 'Shafi';
protected $view = 'Sunni';
* Loads initialize values
public function __construct()
* Setting date of day for Salat calculation
* @param integer $m Month of date you want to calculate Salat in
* @param integer $d Day of date you want to calculate Salat in
* @param integer $y Year (four digits) of date you want to calculate Salat in
* @return object $this to build a fluent interface
* @author Khaled Al-Sham'aa <khaled@ar-php.org>
public function setDate($m = 8, $d = 2, $y = 1975)
$this->month = floor($m);
* Setting location information for Salat calculation
* @param decimal $l1 Latitude of location you want to calculate Salat time in
* @param decimal $l2 Longitude of location you want to calculate Salat time in
* @param integer $z Time Zone, offset from UTC (see also Greenwich Mean Time)
* @param integer $e Elevation, it is the observer's height in meters.
* @return object $this to build a fluent interface
* @author Khaled Al-Sham'aa <khaled@ar-php.org>
public function setLocation($l1 = 36.20278, $l2 = 37.15861, $z = 2, $e = 0)
if (is_numeric($l1) && $l1 >= - 180 && $l1 <= 180) {
if (is_numeric($l2) && $l2 >= - 180 && $l2 <= 180) {
* Setting rest of Salat calculation configuration
* Convention Fajr Angle Isha Angle
* Muslim World League -18 -17
* Islamic Society of North America (ISNA) -15 -15
* Egyptian General Authority of Survey -19.5 -17.5
* Umm al-Qura University, Makkah -18.5
* Isha 90 min after Maghrib, 120 min during Ramadan
* University of Islamic Sciences, Karachi -18 -18
* Institute of Geophysics, University of Tehran -17.7 -14(*)
* Shia Ithna Ashari, Leva Research Institute, Qum -16 -14
* (*) Isha angle is not explicitly defined in Tehran method
* Fajr Angle = $fajrArc, Isha Angle = $ishaArc
* - حزب العلماء في لندن لدول
* أوروبا في خطوط عرض تزيد على 48
* @param string $sch [Shafi|Hanafi] to define Muslims Salat
* calculation method (affect Asr time)
* @param decimal $sunriseArc Sun rise arc (default value is -0.833333)
* @param decimal $ishaArc Isha arc (default value is -18)
* @param decimal $fajrArc Fajr arc (default value is -18)
* @param string $view [Sunni|Shia] to define Muslims Salat calculation
* method (affect Maghrib and Midnight time)
* @return object $this to build a fluent interface
* @author Khaled Al-Sham'aa <khaled@ar-php.org>
$sch = 'Shafi', $sunriseArc = - 0.833333, $ishaArc = - 17.5,
$fajrArc = - 19.5, $view = 'Sunni'
if ($sch == 'Shafi' || $sch == 'Hanafi') {
if (is_numeric($sunriseArc) && $sunriseArc >= - 180 && $sunriseArc <= 180) {
$this->AB2 = $sunriseArc;
if (is_numeric($ishaArc) && $ishaArc >= - 180 && $ishaArc <= 180) {
if (is_numeric($fajrArc) && $fajrArc >= - 180 && $fajrArc <= 180) {
if ($view == 'Sunni' || $view == 'Shia') {
* Alias for getPrayTime2 method
* @return array of Salat times + sun rise in the following format
* hh:mm where hh is the hour in local format and 24 mode
* mm is minutes with leading zero to be 2 digits always
* array items is [$Fajr, $Sunrise, $Dhuhr, $Asr, $Maghrib,
* $Isha, $Sunset, $Midnight, $Imsak, array $timestamps]
* @author Khaled Al-Sham'aa <khaled@ar-php.org>
* @author Hamid Zarrabi-Zadeh <zarrabi@scs.carleton.ca>
* @source http://praytimes.org/calculation
* Calculate Salat times for the date set in setSalatDate methode, and
* location set in setSalatLocation.
* @return array of Salat times + sun rise in the following format
* hh:mm where hh is the hour in local format and 24 mode
* mm is minutes with leading zero to be 2 digits always
* array items is [$Fajr, $Sunrise, $Dhuhr, $Asr, $Maghrib,
* $Isha, $Sunset, $Midnight, $Imsak, array $timestamps]
* @author Khaled Al-Sham'aa <khaled@ar-php.org>
* @author Hamid Zarrabi-Zadeh <zarrabi@scs.carleton.ca>
* @source http://praytimes.org/calculation
$unixtimestamp = mktime(0, 0, 0, $this->month, $this->day, $this->year);
$month = $this->month + 12;
$B = 2 - $A + floor($A / 4);
$jd = floor(365.25 * ($year + 4716)) + floor(30.6001 * ($month + 1))
+ $this->day + $B - 1524.5;
// The following algorithm from U.S. Naval Observatory computes the
// Sun's angular coordinates to an accuracy of about 1 arcminute within
// two centuries of 2000.
$d = $jd - 2451545.0; // jd is the given Julian date
// The following algorithm from U.S. Naval Observatory computes the Sun's
// angular coordinates to an accuracy of about 1 arcminute within two
// http://aa.usno.navy.mil/faq/docs/SunApprox.php
// Note: mod % in PHP ignore decimels!
$g = 357.529 + 0.98560028 * $d;
$g = $g % 360 + ($g - ceil($g) + 1);
$q = 280.459 + 0.98564736 * $d;
$q = $q % 360 + ($q - ceil($q) + 1);
$L = $L % 360 + ($L - ceil($L) + 1);
$e = 23.439 - 0.00000036 * $d;
// The declination of the Sun is the angle between the rays of the sun and
// the plane of the earth equator. The declination of the Sun changes
// continuously throughout the year. This is a consequence of the Earth's
// tilt, i.e. the difference in its rotational and revolutionary axes.
// declination of the Sun
// The equation of time is the difference between time as read from sundial
// and a clock. It results from an apparent irregular movement of the Sun
// caused by a combination of the obliquity of the Earth's rotation axis
// and the eccentricity of its orbit. The sundial can be ahead (fast) by
// as much as 16 min 33 s (around November 3) or fall behind by as much as
// 14 min 6 s (around February 12), as shown in the following graph:
// http://en.wikipedia.org/wiki/File:Equation_of_time.png
$EqT = ($q/ 15) - $RA; // equation of time
// When the Sun begins to decline after reaching its highest point in the sky
$Dhuhr = 12 + $this->zone - ($this->long/ 15) - $EqT;
// If the observer's location is higher than the surrounding terrain, we
// can consider this elevation into consideration by increasing the above
// constant 0.833 by 0.0347 × sqrt(elevation), where elevation is the
// observer's height in meters.
$alpha = 0.833 + 0.0347 * sqrt($this->elevation);
// date_sun_info Returns an array with information about sunset/sunrise
// and twilight begin/end
// Imsak: The time to stop eating Sahur (for fasting), slightly before Fajr.
// Fajr: When the sky begins to lighten (dawn).
// Isha: The time at which darkness falls and there is no scattered light
$Imsak = $Fajr - (10/ 60);
// The following formula computes the time difference between the mid-day
// and the time at which the object's shadow equals t times the length of
// the object itself plus the length of that object's shadow at noon
if ($this->school == 'Shafi') {
// In the Sunni's point of view, the time for Maghrib prayer begins once
// the Sun has completely set beneath the horizon, that is, Maghrib = Sunset
// (some calculators suggest 1 to 3 minutes after Sunset for precaution)
$MaghribSunni = $Sunset + 2/ 60;
// In the Shia's view, however, the dominant opinion is that as long as
// the redness in the eastern sky appearing after sunset has not passed
// overhead, Maghrib prayer should not be performed.
$MaghribShia = $Dhuhr + (1/ 15) * rad2deg(acos($n / $d));
if ($this->view == 'Sunni') {
$Maghrib = $MaghribSunni;
// Midnight is generally calculated as the mean time from Sunset to Sunrise
$MidnightSunni = $Sunset + 0.5 * ($Sunrise - $Sunset);
if ($MidnightSunni > 12) {
$MidnightSunni = $MidnightSunni - 12;
// In Shia point of view, the juridical midnight (the ending time for
// performing Isha prayer) is the mean time from Sunset to Fajr
$MidnightShia = 0.5 * ($Fajr - $Sunset);
if ($MidnightShia > 12) {
$MidnightShia = $MidnightShia - 12;
if ($this->view == 'Sunni') {
$Midnight = $MidnightSunni;
$Midnight = $MidnightShia;
// Result.ThlthAkhir:= Result.Fajr-(24-Result.Maghrib + Result.Fajr)/3;
// Result.Doha := Result.Sunrise+(15/60);
// if isRamadan then (Um-Al-Qura calendar)
// Result.Isha := Result.Maghrib+2
// else Result.Isha := Result.Maghrib+1.5;
$times = array($Fajr, $Sunrise, $Dhuhr, $Asr, $Maghrib, $Isha, $Sunset,
// Convert number after the decimal point into minutes
foreach ($times as $index => $time) {
$minutes = round(($time - $hours) * 60);
$times[$index] = "$hours:$minutes";
$times[9][$index] = $unixtimestamp + 3600 * $hours + 60 * $minutes;
if ($index == 7 && $hours < 6) {
$times[9][$index] += 24 * 3600;
* Determine Qibla direction using basic spherical trigonometric formula
* @return float Qibla Direction (from the north direction) in degrees
* @author Khaled Al-Sham'aa <khaled@ar-php.org>
* @author S. Kamal Abdali <k.abdali@acm.org>
* @source http://www.patriot.net/users/abdali/ftp/qibla.pdf
// The geographical coordinates of the Ka'ba
$K_longitude = 39.823333;
$longitude = $this->long;
$numerator = sin(deg2rad($K_longitude - $longitude));
$q = atan($numerator / $denominator);
if ($this->lat > 21.423333) {
* Convert coordinates presented in degrees, minutes and seconds
* (i.e. 12°34'56"S formula) into usual float number in degree unit scale
* @param string $value Coordinate presented in degrees, minutes and seconds
* (i.e. 12°34'56"S formula)
* @return float Equivalent float number in degree unit scale
* @author Khaled Al-Sham'aa <khaled@ar-php.org>
$pattern = "/(\d{1,2})°((\d{1,2})')?((\d{1,2})\")?([NSEW])/i";
$degree = $matches[1] + ($matches[3] / 60) + ($matches[5] / 3600);
if ($direction == 'S' || $direction == 'W') {
|