كيفية حساب الفرق بين تاريخين في PHP: من المبتدئ إلى المحترف
\n\nهل تساءلت يومًا: «كم يومًا مضى منذ آخر إجازة لي؟» أو «بعد كم ساعة تنتهي العرض على الموقع؟»؟ إذا كنت مطور PHP، فإن هذه الأسئلة تتحول إلى مهمة واحدة: كيفية حساب الفرق بين تاريخين.
\n\nهذا السؤال هو من أكثر الأسئلة شيوعًا على Stack Overflow بآلاف المشاهدات. وليس من دون سبب: العمل مع التواريخ في PHP قد يكون خادعًا. السنوات الكبيسة، المناطق الزمنية، التنسيقات المختلفة — كل هذا يمكن أن يعطل حتى الكود الأكثر دقة.
\n\nفي هذه المقالة، سنستعرض 5 طرق مثبتة لحساب الفرق بين التواريخ في PHP — من أبسطها إلى أكثرها احترافية. ستتعرف متى تستخدم أي طريقة، وستحصل على أمثلة كود جاهزة.
\n\n1. الطريقة الكلاسيكية: strtotime() والحساب البسيط
\n\nأقدم وأسهل طريقة بديهية — تحويل التواريخ إلى طوابع Unix (timestamp) باستخدام الدالة strtotime() وطرح رقم من الآخر.
<?php\n$date1 = strtotime('2024-01-15');\n$date2 = strtotime('2024-03-20');\n\n$diff_seconds = $date2 - $date1;\n$diff_days = floor($diff_seconds / (60 * 60 * 24));\n\necho "الفرق بالأيام: " . $diff_days; // سيطبع: 65\n?>\n\nالإيجابيات: البساطة، تعمل في أي إصدار PHP.
\nالسلبيات: لا تراعي المناطق الزمنية، مشاكل مع التواريخ قبل عام 1970، لا دعم مدمج للأشهر والسنوات (لأن طولها يختلف).
\n\nهذه الطريقة مناسبة للحسابات السريعة «على عجل»، ولكن للمشاريع الجادة من الأفضل استخدام أدوات أكثر حداثة.
\n\n2. المعيار الحديث: فئة DateTime وطريقة diff()
\n\nمنذ PHP 5.2، لدينا فئة DateTime القوية. إنها سكين سويسري حقيقي للعمل مع التواريخ. الطريقة diff() تُرجع كائن DateInterval الذي يحتوي على جميع معلومات الفرق.
<?php\n$date1 = new DateTime('2024-01-15');\n$date2 = new DateTime('2024-03-20');\n\n$interval = $date1->diff($date2);\n\necho "الفرق: " . $interval->days . " يوم"; // 65\necho "أو " . $interval->m . " شهر و " . $interval->d . " يوم"; // شهرين و5 أيام\n?>\n\nDateInterval يوفر الوصول إلى الخصائص التالية:
\n- \n
y— السنوات \n m— الأشهر \n d— الأيام \n h— الساعات \n i— الدقائق \n s— الثواني \n days— العدد الإجمالي للأيام (الأكثر فائدة!) \n invert— علامة: 0 إذا كان التاريخ الأول أقدم، 1 إذا كان أحدث \n
هذه الطريقة تراعي السنوات الكبيسة وتعمل بشكل صحيح مع الخصائص التقويمية المختلفة. وهي الموصى بها في الوثائق الرسمية لـ PHP.
\n\n3. تنسيق الفرق: كيفية عرض «سنتان و3 أشهر و10 أيام»
\n\nغالبًا ما تحتاج ليس فقط إلى الحصول على رقم، بل تنسيق الفرق بشكل جميل للمستخدم. طريقة format() لكائن DateInterval تأتي للإنقاذ.
<?php\n$birthday = new DateTime('1990-05-15');\n$today = new DateTime();\n\n$age = $birthday->diff($today);\n\necho $age->format('%y سنة %m شهر %d يوم');\n// مثال: 34 سنة شهرين 3 أيام\n?>\n\nمحددات التنسيق:
\n- \n
%y— السنوات \n %m— الأشهر \n %d— الأيام \n %h— الساعات \n %i— الدقائق \n %s— الثواني \n %a— العدد الإجمالي للأيام (بديلdays) \n %r— علامة "ناقص" إذا كان الفرق سالبًا \n
هل تريد تصريف الكلمات «يوم/يومين/أيام»؟ ستحتاج إلى كتابة منطقك الخاص