الفرق بين التواريخ في PHP: 5 طرق من البسيط إلى الاحترافي

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كيفية حساب الفرق بين تاريخين في PHP: من المبتدئ إلى المحترف

\n\n

هل تساءلت يومًا: «كم يومًا مضى منذ آخر إجازة لي؟» أو «بعد كم ساعة تنتهي العرض على الموقع؟»؟ إذا كنت مطور PHP، فإن هذه الأسئلة تتحول إلى مهمة واحدة: كيفية حساب الفرق بين تاريخين.

\n\n

هذا السؤال هو من أكثر الأسئلة شيوعًا على Stack Overflow بآلاف المشاهدات. وليس من دون سبب: العمل مع التواريخ في PHP قد يكون خادعًا. السنوات الكبيسة، المناطق الزمنية، التنسيقات المختلفة — كل هذا يمكن أن يعطل حتى الكود الأكثر دقة.

\n\n

في هذه المقالة، سنستعرض 5 طرق مثبتة لحساب الفرق بين التواريخ في PHP — من أبسطها إلى أكثرها احترافية. ستتعرف متى تستخدم أي طريقة، وستحصل على أمثلة كود جاهزة.

\n\n

1. الطريقة الكلاسيكية: strtotime() والحساب البسيط

\n\n

أقدم وأسهل طريقة بديهية — تحويل التواريخ إلى طوابع Unix (timestamp) باستخدام الدالة strtotime() وطرح رقم من الآخر.

\n\n
<?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\n

2. المعيار الحديث: فئة DateTime وطريقة diff()

\n\n

منذ PHP 5.2، لدينا فئة DateTime القوية. إنها سكين سويسري حقيقي للعمل مع التواريخ. الطريقة diff() تُرجع كائن DateInterval الذي يحتوي على جميع معلومات الفرق.

\n\n
<?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\n

DateInterval يوفر الوصول إلى الخصائص التالية:

\n
    \n
  • y — السنوات
  • \n
  • m — الأشهر
  • \n
  • d — الأيام
  • \n
  • h — الساعات
  • \n
  • i — الدقائق
  • \n
  • s — الثواني
  • \n
  • days — العدد الإجمالي للأيام (الأكثر فائدة!)
  • \n
  • invert — علامة: 0 إذا كان التاريخ الأول أقدم، 1 إذا كان أحدث
  • \n
\n\n

هذه الطريقة تراعي السنوات الكبيسة وتعمل بشكل صحيح مع الخصائص التقويمية المختلفة. وهي الموصى بها في الوثائق الرسمية لـ PHP.

\n\n

3. تنسيق الفرق: كيفية عرض «سنتان و3 أشهر و10 أيام»

\n\n

غالبًا ما تحتاج ليس فقط إلى الحصول على رقم، بل تنسيق الفرق بشكل جميل للمستخدم. طريقة format() لكائن DateInterval تأتي للإنقاذ.

\n\n
<?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
\n\n

هل تريد تصريف الكلمات «يوم/يومين/أيام»؟ ستحتاج إلى كتابة منطقك الخاص

المدونات

توصيات الكتب