في هذه الصفحة
نظرة عامة#
يحسب RtlyKit\Prayer\PrayerTimes الأوقات الستة اليومية من معادلات فلكية، دون اتصال بالشبكة ودون ملف بيانات. ميل الشمس ومعادلة الزمن مأخوذان من المتسلسلة منخفضة الدقة في كتاب Jean Meeus Astronomical Algorithms (وهي المعادلات نفسها في حاسبة NOAA الشمسية). وتأتي الزاوية الساعية من حساب المثلثات الكروية، والعصر من معامل طول الظل، والشروق والغروب من ارتفاع قدره -0.833 درجة (الانكسار الجوي مع نصف قطر الشمس). أما زوايا الفجر والمغرب والعشاء فهي الاصطلاحات المنشورة لكل طريقة.
النتائج نصوص بصيغة HH:MM بالتوقيت المحلي للمنطقة الزمنية الخاصة بالحاسبة، مقرَّبة إلى أقرب دقيقة.
بداية سريعة#
use RtlyKit\Prayer\PrayerTimes;
$tz = new DateTimeZone('Asia/Tehran');
$day = new DateTimeImmutable('2026-03-21 12:00', $tz);
$times = PrayerTimes::forCity('tehran')->getTimes($day);
echo json_encode($times);
// {"fajr":"04:43","sunrise":"06:07","dhuhr":"12:12","asr":"15:39","maghrib":"18:35","isha":"19:22"}
إذا حذفت التاريخ، تستخدم getTimes() تاريخ اليوم بحسب المنطقة الزمنية للحاسبة. والتاريخ الذي تمرّره يحدد اليوم التقويمي المحلي لتلك المنطقة. وهناك أيضًا اختصار ضمن فضاء الأسماء يُرجع المصفوفة نفسها لليوم الحالي: \RtlyKit\prayer_times('tehran', 'Tehran') (انظر الدوال المساعدة والدوال العامة).
إنشاء حاسبة#
هناك طريقتان لبنائها.
// 1) مدينة مضمَّنة: تُملأ الإحداثيات والمنطقة الزمنية.
$p = PrayerTimes::forCity('mecca', PrayerTimes::METHOD_MAKKAH);
// 2) إحداثياتك الخاصة.
$p = new PrayerTimes(
latitude: 35.6892,
longitude: 51.3890,
method: PrayerTimes::METHOD_TEHRAN, // default
asrFactor: PrayerTimes::ASR_STANDARD, // default
timezone: new DateTimeZone('Asia/Tehran'), // default: date_default_timezone_get()
elevation: 0.0, // metres, default 0
);
تعرف forCity() هذه الأسماء (دون حساسية لحالة الأحرف): tehran وmashhad وisfahan وshiraz وtabriz وqom وmecca وmedina وriyadh وistanbul وcairo وdubai وbaghdad وjakarta. وأي اسم آخر يُثير استثناءً؛ للمدن الأخرى استخدم المُنشئ مع إحداثياتك.
الطرق والزوايا#
تحدد الطريقة زاوية انخفاض الشمس للفجر والعشاء (وللمغرب أيضًا في طريقة طهران). استخدم ثوابت الصنف بدلًا من النصوص.
| الثابت | الفجر | المغرب | العشاء |
|---|---|---|---|
METHOD_TEHRAN (Tehran، الافتراضي) | 17.7 درجة | الشمس على بعد 4.5 درجة تحت الأفق | 14 درجة |
METHOD_MWL (MWL) | 18 درجة | الغروب | 17 درجة |
METHOD_ISNA (ISNA) | 15 درجة | الغروب | 15 درجة |
METHOD_EGYPT (Egypt) | 19.5 درجة | الغروب | 17.5 درجة |
METHOD_MAKKAH (Makkah) | 18.5 درجة | الغروب | المغرب + 90 دقيقة (+120 دقيقة في رمضان) |
METHOD_KARACHI (Karachi) | 18 درجة | الغروب | 18 درجة |
اليوم نفسه في طهران محسوبًا بكل طريقة (الفجر والمغرب والعشاء فقط تختلف؛ أما الشروق والظهر والعصر فلا تعتمد على الطريقة):
foreach (['Tehran', 'MWL', 'ISNA', 'Egypt', 'Makkah', 'Karachi'] as $m) {
echo str_pad($m, 8), json_encode(PrayerTimes::forCity('tehran', $m)->getTimes($day)), "\n";
}
// Tehran {"fajr":"04:43","sunrise":"06:07","dhuhr":"12:12","asr":"15:39","maghrib":"18:35","isha":"19:22"}
// MWL {"fajr":"04:42","sunrise":"06:07","dhuhr":"12:12","asr":"15:39","maghrib":"18:17","isha":"19:37"}
// ISNA {"fajr":"04:57","sunrise":"06:07","dhuhr":"12:12","asr":"15:39","maghrib":"18:17","isha":"19:27"}
// Egypt {"fajr":"04:34","sunrise":"06:07","dhuhr":"12:12","asr":"15:39","maghrib":"18:17","isha":"19:40"}
// Makkah {"fajr":"04:39","sunrise":"06:07","dhuhr":"12:12","asr":"15:39","maghrib":"18:17","isha":"19:47"}
// Karachi {"fajr":"04:42","sunrise":"06:07","dhuhr":"12:12","asr":"15:39","maghrib":"18:17","isha":"19:42"}
الظهر هو منتصف النهار الشمسي (عبور الشمس للزوال)، ولا يُضاف أي هامش احتياط إلى أي وقت.
مذاهب العصر#
يبدأ العصر حين يساوي ظلّ الجسم ظلّه وقت الزوال مضافًا إليه مضاعف لارتفاعه. يُستخدم ASR_STANDARD (القيمة 1، أي مثل الارتفاع) عند المذاهب الشافعي والمالكي والحنبلي والجعفري؛ أما ASR_HANAFI (القيمة 2، أي مثلا الارتفاع) فيعطي وقتًا أكثر تأخرًا.
$hanafi = PrayerTimes::forCity('tehran', 'Tehran', PrayerTimes::ASR_HANAFI);
echo $hanafi->getTimes($day)['asr']; // 16:32 (standard: 15:39)
مكة: العشاء في رمضان#
يحدد اصطلاح أم القرى العشاء بعد المغرب بـ 90 دقيقة، وبـ 120 دقيقة في رمضان. تختار الحاسبة 120 حين يقع التاريخ المدني المحلي في رمضان بحسب جدول أم القرى الهجري الخاص بالحزمة (الشهر 9)، وتختار 90 فيما عدا ذلك. والقرار يتبع التاريخ المدني، لا اليوم الإسلامي الذي يبدأ من الغروب.
$mk = PrayerTimes::forCity('mecca', 'Makkah');
foreach (['2026-02-20', '2026-03-01', '2026-03-21'] as $s) {
$t = $mk->getTimes(new DateTimeImmutable($s, new DateTimeZone('Asia/Riyadh')));
echo $s, ' maghrib ', $t['maghrib'], ' isha ', $t['isha'], "\n";
}
// 2026-02-20 maghrib 18:21 isha 20:21 (+120, Ramadan)
// 2026-03-01 maghrib 18:25 isha 20:25 (+120, Ramadan)
// 2026-03-21 maghrib 18:32 isha 20:02 (+90, after Ramadan)
الارتفاع عن سطح البحر#
الوسيط elevation هو ارتفاع الراصد بالأمتار. يخفض ارتفاع الشروق والغروب بالانخفاض الهندسي للأفق 0.0347 * sqrt(h) درجة، فيصبح الشروق أبكر والغروب أكثر تأخرًا على الجبل. القيم السالبة تُعامل على أنها 0. ويؤثر في الشروق والغروب والأوقات المشتقة من الغروب فقط.
$a = new PrayerTimes(35.6892, 51.3890, 'Tehran', 1, $tz);
$b = new PrayerTimes(35.6892, 51.3890, 'Tehran', 1, $tz, 1500.0);
$d = new DateTimeImmutable('2026-06-21', $tz);
echo $a->getTimes($d)['sunrise'], "\n"; // 04:49
echo $b->getTimes($d)['sunrise'], "\n"; // 04:41
في طريقة طهران يتحدد المغرب بزاوية 4.5 درجة وليس بالغروب، فلا يتغير مع الارتفاع (19:45 في الحالتين أعلاه).
المناطق الزمنية والتوقيت الصيفي#
يُحوَّل كل وقت باستخدام فرق التوقيت الفعلي عن UTC للمنطقة في تلك اللحظة، فيُعالَج تغيير التوقيت الصيفي في منتصف العام دون أي عمل إضافي. تتغير برلين في 2026-03-29:
$tzb = new DateTimeZone('Europe/Berlin');
$ber = new PrayerTimes(52.52, 13.405, 'MWL', 1, $tzb);
foreach (['2026-03-28', '2026-03-29'] as $s) {
echo $s, ' ', json_encode($ber->getTimes(new DateTimeImmutable($s, $tzb))), "\n";
}
// 2026-03-28 {"fajr":"03:51","sunrise":"05:50","dhuhr":"12:11","asr":"15:39","maghrib":"18:34","isha":"20:26"}
// 2026-03-29 {"fajr":"04:48","sunrise":"06:48","dhuhr":"13:11","asr":"16:40","maghrib":"19:35","isha":"21:28"}
مرّر المنطقة التي يقرأ مستخدموك الساعة بحسبها. وإذا أهملتها يُستخدم date_default_timezone_get().
الصلاة التالية#
تُرجع nextPrayer() أول صلاة تقع بعد لحظة معينة بدقة (الافتراضي: الآن). تقارن الدالة أوقات أمس واليوم وغد، فتجد الصلاة التي تقع بعد منتصف الليل مع تاريخها الصحيح في الحقل date. وبعد العشاء تنتقل إلى فجر الغد.
$p = PrayerTimes::forCity('tehran');
echo json_encode($p->nextPrayer(new DateTimeImmutable('2026-03-21 10:00', $tz)));
// {"name":"dhuhr","time":"12:12","date":"2026-03-21"}
echo json_encode($p->nextPrayer(new DateTimeImmutable('2026-03-21 20:00', $tz)));
// {"name":"fajr","time":"04:42","date":"2026-03-22"}
ويظهر أثر ذلك في الصيف شمالًا، حيث قد يقع العشاء بعد منتصف الليل (أوسلو، 21 يونيو):
$tzo = new DateTimeZone('Europe/Oslo');
$osl = new PrayerTimes(59.91, 10.75, 'MWL', 1, $tzo);
echo json_encode($osl->nextPrayer(new DateTimeImmutable('2026-06-21 23:30', $tzo)));
// {"name":"isha","time":"00:12","date":"2026-06-22"}
الشروق عنصر في هذا التسلسل (الترتيب: fajr وsunrise وdhuhr وasr وmaghrib وisha).
خطوط العرض العالية#
في الصيف، بعيدًا عن خط الاستواء، قد لا تبلغ الشمس زاوية الفجر أو العشاء أصلًا، أو تبلغها في ساعة بعيدة جدًا عن الشروق والغروب. تعالج المكتبة ذلك بقاعدة من RtlyKit\Prayer\HighLatitudeRule تختارها بـ withHighLatitudeRule() (تُرجع حاسبة جديدة):
| القاعدة | ما تفعله |
|---|---|
AngleBased (الافتراضي) | تحدّ الفجر والعشاء بجزء من الليل يساوي الزاوية ÷ 60 (للزاوية 18 درجة: 0.3 من الليل) |
NightMiddle | الجزء نصف الليل |
OneSeventh | الجزء سُبع الليل |
None | لا تعديل: الوقت الذي لا تبلغ الشمس زاويته يكون null |
الليل هنا من الغروب إلى شروق اليوم التالي. القاعدة تعمل فقط حين يتعذر حساب الوقت أو يقع خارج الحد؛ وكل وقت آخر يبقى بقيمته الفلكية. ولذلك فالحسابات جنوب نحو 44 درجة شمالًا لم تتغير. وبين نحو 44 و46 درجة شمالًا قرب 21 يونيو تختلف بعض قيم الفجر والعشاء عن الإصدارات 0.1.x، وتُعيد None الناتج القديم. (ميونخ، 21 يونيو، MWL):
use RtlyKit\Prayer\HighLatitudeRule;
$tzm = new DateTimeZone('Europe/Berlin');
$day = new DateTimeImmutable('2026-06-21', $tzm);
$muc = new PrayerTimes(48.14, 11.58, 'MWL', 1, $tzm);
echo json_encode($muc->getTimes($day)), "\n";
// {"fajr":"02:51","sunrise":"05:13","dhuhr":"13:15","asr":"17:31","maghrib":"21:18","isha":"23:32"}
echo json_encode($muc->withHighLatitudeRule(HighLatitudeRule::None)->getTimes($day)), "\n";
// {"fajr":"01:50","sunrise":"05:13","dhuhr":"13:15","asr":"17:31","maghrib":"21:18","isha":"00:12"}
echo json_encode($muc->withHighLatitudeRule(HighLatitudeRule::OneSeventh)->getTimes($day)), "\n";
// {"fajr":"04:05","sunrise":"05:13","dhuhr":"13:15","asr":"17:31","maghrib":"21:18","isha":"22:26"}
وفي أوسلو في اليوم نفسه، حيث لا تبلغ الشمس زاويتي الفجر والعشاء إطلاقًا، تعطي القاعدة الافتراضية قيمتين بدل null (راجع أيضًا العشاء بعد منتصف الليل في القسم السابق):
$day = new DateTimeImmutable('2026-06-21', $tzo);
echo json_encode($osl->getTimes($day)), "\n";
// {"fajr":"02:21","sunrise":"03:54","dhuhr":"13:19","asr":"18:00","maghrib":"22:44","isha":"00:12"}
echo json_encode($osl->withHighLatitudeRule(HighLatitudeRule::None)->getTimes($day)), "\n";
// {"fajr":null,"sunrise":"03:54","dhuhr":"13:19","asr":"18:00","maghrib":"22:44","isha":null}
وفي النهار القطبي (ترومسو، 21 يونيو) لا تشرق الشمس ولا تغرب، فيبقى الشروق والمغرب null، ويُحسب الفجر والعشاء من ليلة مرجعية مدتها 12 ساعة. وهذا اصطلاح اخترناه في المكتبة وليس اصطلاحًا منشورًا؛ ومن يريد سلوكًا آخر (أقرب يوم أو أقرب خط عرض) فليستعمل None ويقرر بنفسه.
$tro = new PrayerTimes(69.65, 18.96, 'MWL', 1, $tzo);
echo json_encode($tro->getTimes($day)), "\n";
// {"fajr":"03:10","sunrise":null,"dhuhr":"12:46","asr":"17:58","maghrib":null,"isha":"22:10"}
ضبط الدقائق يدويًا#
تعتمد بعض المساجد والجهات هامش احتياط في بعض الأوقات. استعمل withTune() لإضافة دقائق (من -30 إلى +30) إلى أي من الأوقات الستة: fajr وsunrise وdhuhr وasr وmaghrib وisha. تُرجع الدالة حاسبة جديدة، وما لم تذكره يبقى صفرًا؛ فاستدعاؤها يستبدل أي ضبط سابق، وwithTune([]) يمسحه. وتدخل الدقائق المضافة في nextPrayer() أيضًا.
$p = PrayerTimes::forCity('tehran');
echo json_encode($p->withTune(['fajr' => 2, 'maghrib' => 3])->getTimes($day)), "\n";
// {"fajr":"04:45","sunrise":"06:07","dhuhr":"12:12","asr":"15:39","maghrib":"18:38","isha":"19:22"}
تُضاف الدقائق قبل التقريب، فقد ينتقل الوقت عبر منتصف الليل (23:50 مع +20 يصبح 00:10). والمفتاح غير المعروف، والقيمة التي ليست int أو الخارجة عن المجال، تُثير InvalidPrayerConfigException مع السياق key.
الاستثناءات#
الإعداد غير الصالح يُثير InvalidPrayerConfigException، وهي ترث RtlyKitException (ومن ثَمّ \InvalidArgumentException)، مثلًا:
new PrayerTimes(35, 51, 'Foo');
// Unknown calculation method: Foo. Available: MWL, ISNA, Egypt, Makkah, Karachi, Tehran
new PrayerTimes(35, 51, 'MWL', 3);
// Invalid Asr factor: 3 (use 1 or 2)
PrayerTimes::forCity('paris');
// Unknown city: paris
PrayerTimes::forCity('tehran')->withTune(['fajr' => 31]);
// Tune for fajr must be an integer from -30 to 30 minutes
انظر معالجة الأخطاء لالتقاط كل أخطاء المكتبة بعبارة catch واحدة.
ما الذي فحصناه#
الزوايا اصطلاحات تحددها الجهة التي تعرّف كل طريقة، والمكتبة مكتوبة مستقلة عن أي برنامج آخر. لذلك الفحص المفيد هو مقارنة مخرجاتنا لمدينة وتاريخ معينين بالجدول الذي تنشره الجهة المعنية. اعتبرنا الفرق ضمن دقيقة إلى دقيقتين توافقًا، لأن الجداول مقرّبة إلى الدقيقة. وجرى الفحص في 2026-10-08. أما المواقع المجمِّعة فلم نحتسبها دليلًا، لأنها تستعمل الزوايا المنشورة نفسها.
| ما قورن | المرجع | النتيجة |
|---|---|---|
| طريقة طهران: الفجر والشروق والظهر والمغرب | جداول معهد الجيوفيزياء بجامعة طهران لعام 1405: طهران ومشهد وأصفهان وشيراز في أربعة تواريخ | تطابق حتى الدقيقة في كل القيم عدا فرق دقيقة واحدة في شيراز |
| طريقة مكة: الأوقات الستة، ومنها عشاء رمضان | تقويم أم القرى الرسمي: خمسة تواريخ خارج رمضان وتاريخان في رمضان 1447 | ضمن دقيقة واحدة، والعشاء = المغرب + 120 في رمضان |
| طريقة مصر: الأوقات الستة | جدول دار الإفتاء المصرية للقاهرة، أكتوبر 2026 | ضمن دقيقة واحدة |
| تركيا (ديانت): الفجر والعشاء | جداول رئاسة الشؤون الدينية التركية لإسطنبول وأنقرة وإزمير | متسقة مع زاويتي 18 / 17 نفسيهما، ضمن دقيقة واحدة |
| طريقة كراتشي مع العصر الحنفي | جدول منشور لجامعة في كراتشي (جامعة العلوم الإسلامية، بنوري تاون)، أكتوبر 2026 كله (31 يومًا) | ضمن دقيقة واحدة في كل الأيام |
| كراتشي (18 / 18) | ماليزيا، JAKIM e-solat، المنطقة SGR01: أربعة تواريخ في أكتوبر 2026 | الفجر والعشاء يختلفان بدقيقة إلى دقيقتين، وهذا يوافق 18 / 18 |
| قاعدة العصر الحنفي (ظل = مثلان) | فتاوى دار العلوم ديوبند | هي القاعدة التي تحسبها المكتبة بالمعامل 2 |
| طريقة ISNA (15 / 15) | المجلس الفقهي لأمريكا الشمالية | الزاويتان 15 / 15 هما المذكورتان للإعداد الموافق لـ ISNA |
| الشروق والغروب | عينات من مدن وتواريخ مقابل حاسبة NOAA الشمسية وموقع timeanddate | ضمن دقيقة واحدة |
تطابق طريقة طهران جداول معهد الجيوفيزياء، وقد أكّد هذا التطابق العددي الزاويتين 17.7 درجة (الفجر) و4.5 درجة (المغرب). وللتفاصيل عن بقية البيانات انظر الدقة والبيانات.