الوقت لا ينتظر: لماذا التعامل مع التواريخ في PHP معقد (وكيفية إصلاح ذلك)
\n\nتخيل: أنت تكتب مدونة، متجرًا إلكترونيًا أو لوحة تحكم شخصية. وفجأة تدرك — تحتاج إلى إظهار للمستخدم متى تم نشر المقال، أو تقديم الطلب، أو إرسال الرسالة. قد يبدو الأمر بسيطًا؟ تأخذ الدالة date() — وتنتهي.
لكن الشيطان، كما هو الحال دائمًا، في التفاصيل. في عام 2025، لا يزال مطورو PHP يرتكبون نفس الأخطاء: يخلطون بين المناطق الزمنية، ينسون عدم قابلية الكائنات للتغيير، يستخدمون دوالًا قديمة. ثم يتفاجأون لماذا الوقت على الموقع "يقفز" والاختبارات تفشل.
\n\nفي هذه المقالة، سنستعرض أفضل الممارسات للعمل مع التاريخ والوقت في PHP — من الحلول البسيطة إلى الأساليب الاحترافية. ستتعلم كيفية الحصول على التاريخ الحالي، وكيفية العمل مع المناطق الزمنية، وكيف لا تطلق النار على قدمك عند العمل مع الطوابع الزمنية.
\n\n1. الطريقة الأسهل: الدالة date()
\n\nلنبدأ بالكلاسيكيات. الدالة date() — هي ما يبدأ به 90% من المبتدئين. تأخذ معلمتين: تنسيق الإخراج و (اختياريًا) timestamp. إذا لم يتم تحديد timestamp، يتم استخدام الوقت الحالي للخادم.
echo date('Y-m-d H:i:s');\n// الإخراج: 2025-04-08 14:35:12\n\nإليك أكثر التنسيقات شيوعًا:
\n- \n
Y— السنة (4 أرقام) \n m— الشهر (01–12) \n d— يوم الشهر (01–31) \n H— الساعات بصيغة 24 ساعة \n i— الدقائق \n s— الثواني \n
المشكلة: date() تعتمد على إعداد date.timezone في ملف php.ini. إذا لم تقم بتعيين المنطقة الزمنية، سيستخدم PHP وقت النظام للخادم. وقد يكون الخادم في منطقة زمنية مختلفة — وبالتالي سيرى مستخدموك وقتًا غير صحيح.
2. النهج الاحترافي: كلاس DateTime
\n\nبدءًا من PHP 5.2، لدينا كلاس DateTime. هذه طريقة موجهة للكائنات للعمل مع التواريخ، وهي أكثر مرونة وأمانًا من الدوال date() و time().
$now = new DateTime();\necho $now->format('Y-m-d H:i:s');\n// الإخراج: 2025-04-08 14:35:12\n\nمزايا DateTime:
\n- \n
- يمكن بسهولة تعيين المنطقة الزمنية عبر المُنشئ \n
- يدعم تعديل التاريخ (إضافة أيام، أشهر) \n
- يمكنه مقارنة التواريخ مع بعضها البعض \n
- يعمل مع الفترات الزمنية \n
مثال مع المنطقة الزمنية:
\n\n$now = new DateTime('now', new DateTimeZone('Europe/Moscow'));\necho $now->format('Y-m-d H:i:s');\n// الإخراج: 2025-04-08 17:35:12 (MSK, UTC+3)\n\n2.1. DateTimeImmutable — صديقك الجديد الأفضل
\n\nفي PHP 5.5 ظهر DateTimeImmutable. الفرق الرئيسي بينه وبين DateTime العادي: أنه لا يغير نفسه. بدلاً من ذلك، كل دالة (مثل modify() أو add()) تُرجع كائنًا جديدًا.
$date = new DateTimeImmutable();\n$modified = $date->modify('+1 day');\n\necho $date->format('Y-m-d'); // 2025-04-08 (لم يتغير!)\necho $modified->format('Y-m-d'); // 2025-04-09 (كائن جديد)\n\nلماذا هذا مهم؟ لأن DateTime العادي هو كائن مرجعي. إذا مررته إلى دالة وتم تغييره هناك، فإن الأصل سيتغير أيضًا. مع Immutable لا توجد هذه المشكلة. في عام 2025، يعتبر هذا المعيار الفعلي للمشاريع الجادة.
\n\n3. كيفية الحصول على timestamp: time() مقابل DateTime
\n\nأحيانًا تحتاج ليس إلى التاريخ، بل إلى Unix timestamp — عدد الثواني منذ 1 يناير 1970. يقدم PHP طريقتين:
\n\n// الطريقة القديمة\necho time(); // 1744112112\n\n// الطريقة الجديدة\necho (new DateTime())->getTimestamp(); // 1744112112\n\nللمهام البسيطة، time() مناسبة تمامًا