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

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

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

ابدأ الدورة

كيفية حساب الفرق بين تاريخين في PHP: دليل شامل مع أمثلة

\n\n

هل سبق لك أن واجهت مهمة مثل: "كم يوماً مضى منذ تسجيل المستخدم؟"، "ما هو عمر الشخص بناءً على تاريخ ميلاده؟" أو "بعد كم ساعة تنتهي الحملة الترويجية؟" إذا كان الأمر كذلك، فأنت بالتأكيد تساءلت: كيفية حساب الفرق بين تاريخين في PHP؟ هذا واحد من أكثر الأسئلة شيوعاً على Stack Overflow، وليس من دون سبب: التعامل مع التواريخ موضوع أساسي ولكنه خادع.

\n\n

في هذا المقال، سنستعرض ثلاث طرق رئيسية: الطريقة التقليدية strtotime()، والطريقة الحديثة الموجهة للكائنات DateTime، والحزمة الخارجية القوية Carbon. ستتعلم ليس فقط "كيف تفعل ذلك"، بل أيضاً أي طريقة تختار لمهمتك. هيا بنا!

\n\n

لماذا طرح التواريخ مباشرة فكرة سيئة؟

\n\n

غالباً ما يحاول المطورون المبتدئون فعل ذلك:

\n\n
<?php\n$date1 = '2024-01-15';\n$date2 = '2024-01-10';\n$diff = $date2 - $date1; // خطأ! لا يمكن طرح السلاسل النصية\n?>\n
\n\n

PHP لا يمكنه طرح السلاسل النصية، حتى لو كانت تشبه التواريخ. ستكون النتيجة 0 أو تحذير. حتى إذا استخدمت strtotime() وحصلت على طوابع Unix، فإن طرح الثواني سيعطيك فقط عدد الثواني، وليس تنسيقاً مناسباً مثل "يومين و3 ساعات و15 دقيقة". لهذا تحتاج إلى أدوات خاصة.

\n\n

الطريقة 1: الطريقة التقليدية — strtotime() والحسابات اليدوية

\n\n

هذه الطريقة مألوفة لكل من بدأ مع PHP 4 أو 5. الدالة strtotime() تحول التمثيل النصي للتاريخ إلى طابع Unix (عدد الثواني منذ 1 يناير 1970). ثم نطرح الطوابع ونقسم على عدد الثواني في اليوم.

\n\n

مثال: الفرق بالأيام

\n\n
<?php\n$date1 = strtotime('2024-12-25');\n$date2 = strtotime('2024-12-20');\n\n$seconds_diff = $date1 - $date2;\n$days_diff = floor($seconds_diff / (60 * 60 * 24));\n\necho "الفرق: $days_diff أيام"; // سيطبع: الفرق: 5 أيام\n?>\n
\n\n

الإيجابيات: بسيطة، لا تتطلب كائنات، تعمل بسرعة.

\n\n

السلبيات:
\n- لا تدعم المناطق الزمنية (دائماً UTC).
\n- عند التحول إلى التوقيت الصيفي/الشتوي، قد يحدث خطأ بمقدار ساعة واحدة (وبالتالي يوم واحد إذا وقع حد التحول في الفاصل الزمني الخاص بك).
\n- للحصول على الفرق بالأشهر أو السنوات، تحتاج إلى كتابة منطق معقد مع مراعاة السنوات الكبيسة.

\n\n

متى تستخدم: فقط للحسابات التقريبية (مثل "هل مضى أكثر من 30 يوماً؟") أو إذا كان لديك قاعدة بيانات قديمة.

\n\n

الطريقة 2: DateTime وDateInterval — المعيار الحديث في PHP

\n\n

بدءاً من PHP 5.2، ظهرت الفئة القوية DateTime في اللغة. بالاقتران مع DateInterval، تحل 95% من مهام التعامل مع التواريخ. هذه هي الطريقة الموصى بها لحساب الفرق بين تاريخين في PHP.

\n\n

مثال أساسي: الفرق بالأيام والأشهر والسنوات

\n\n
<?php\n$date1 = new DateTime('2024-01-15');\n$date2 = new DateTime('2023-11-10');\n$interval = $date1->diff($date2);\n\necho $interval->format('%y سنوات، %m أشهر، %d أيام');\n// سيطبع: 0 سنوات، 2 أشهر، 5 أيام\n?>\n
\n\n

السحر في أن diff() يراعي تلقائياً السنوات الكبيسة، واختلاف عدد الأيام في الأشهر، وحتى المناطق الزمنية (إذا تم تعيينها).

\n\n

الوصول إلى المكونات الفردية

\n\n
<?php\n$date1 = new DateTime('2024-12-25');\n$date2 = new DateTime('2024-01-01');\n$interval = $date1->diff($date2);\n\necho "السنوات: " . $interval->y . "<br>";\necho "الأشهر: " . $interval->m . "<br>";\necho "الأيام: " . $interval->d . "<br>";\necho "إجمالي الأيام: " . $interval->days . "<br>";\n// سيطبع:\n// السنوات: 0\n// الأشهر: 11\n// الأيام: 24\n// إجمالي الأيام: 359\n?>\n
\n\n

لاحظ الخاصية days — هذا هو العدد الإجمالي للأيام في الفاصل الزمني (على عكس d الذي يعرض

المدونات

توصيات الكتب