التاريخ والوقت في PHP في 2025: لا تكرروا هذه الأخطاء الخمسة

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

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

ابدأ الدورة

الوقت لا ينتظر: لماذا التعامل مع التواريخ في PHP معقد (وكيفية إصلاح ذلك)

\n\n

تخيل: أنت تكتب مدونة، متجرًا إلكترونيًا أو لوحة تحكم شخصية. وفجأة تدرك — تحتاج إلى إظهار للمستخدم متى تم نشر المقال، أو تقديم الطلب، أو إرسال الرسالة. قد يبدو الأمر بسيطًا؟ تأخذ الدالة date() — وتنتهي.

\n\n

لكن الشيطان، كما هو الحال دائمًا، في التفاصيل. في عام 2025، لا يزال مطورو PHP يرتكبون نفس الأخطاء: يخلطون بين المناطق الزمنية، ينسون عدم قابلية الكائنات للتغيير، يستخدمون دوالًا قديمة. ثم يتفاجأون لماذا الوقت على الموقع "يقفز" والاختبارات تفشل.

\n\n

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

\n\n

1. الطريقة الأسهل: الدالة date()

\n\n

لنبدأ بالكلاسيكيات. الدالة date() — هي ما يبدأ به 90% من المبتدئين. تأخذ معلمتين: تنسيق الإخراج و (اختياريًا) timestamp. إذا لم يتم تحديد timestamp، يتم استخدام الوقت الحالي للخادم.

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

المشكلة: date() تعتمد على إعداد date.timezone في ملف php.ini. إذا لم تقم بتعيين المنطقة الزمنية، سيستخدم PHP وقت النظام للخادم. وقد يكون الخادم في منطقة زمنية مختلفة — وبالتالي سيرى مستخدموك وقتًا غير صحيح.

\n\n

2. النهج الاحترافي: كلاس DateTime

\n\n

بدءًا من PHP 5.2، لدينا كلاس DateTime. هذه طريقة موجهة للكائنات للعمل مع التواريخ، وهي أكثر مرونة وأمانًا من الدوال date() و time().

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

مثال مع المنطقة الزمنية:

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

2.1. DateTimeImmutable — صديقك الجديد الأفضل

\n\n

في PHP 5.5 ظهر DateTimeImmutable. الفرق الرئيسي بينه وبين DateTime العادي: أنه لا يغير نفسه. بدلاً من ذلك، كل دالة (مثل modify() أو add()) تُرجع كائنًا جديدًا.

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

3. كيفية الحصول على 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() مناسبة تمامًا

المدونات

توصيات الكتب