العمل مع التواريخ في PHP: أفضل المكتبات والأدوات
معالجة التواريخ والوقت هي واحدة من أكثر المهام شيوعًا في تطوير الويب. توفر PHP مجموعة أدوات مضمنة قوية، ولكن للمشاريع المعقدة غالبًا ما تكون هناك حاجة إلى مكتبات أكثر ملاءمة. في هذه المقالة، سنستعرض الطرق الرئيسية للعمل مع التواريخ في PHP، ونقارن المكتبات الشائعة، ونعرض أمثلة عملية.
الفئات المضمنة في PHP: DateTime و DateTimeImmutable
ابتداءً من الإصدار 5.2، تتضمن PHP فئات موجهة للكائنات للعمل مع التواريخ. أهمها:
DateTime— كائن تاريخ/وقت قابل للتعديلDateTimeImmutable— نظير غير قابل للتعديل (أكثر أمانًا عند التمرير بالمرجع)DateInterval— تمثيل الفاصل الزمنيDatePeriod— التكرار عبر التواريخ بفاصل زمني محدد
مثال على إنشاء وتنسيق التاريخ:
<?php$date = new DateTime('2024-12-25 10:30:00');echo $date->format('Y-m-d H:i:s'); // 2024-12-25 10:30:00
// إضافة أسبوع واحد$date->modify('+1 week');echo $date->format('Y-m-d'); // 2025-01-01?>Carbon — المعيار الفعلي لـ Laravel
Carbon هو امتداد لفئة DateTime يضيف عشرات الطرق الملائمة. تُستخدم المكتبة بنشاط في Laravel و Symfony. التثبيت عبر Composer:
composer require nesbot/carbonالإمكانيات الرئيسية لـ Carbon:
- معدِّلات مفهومة للبشر:
->addDay()،->subMonth()،->startOfWeek() - التدويل:
Carbon::setLocale('ar') - التواريخ النسبية:
->diffForHumans()(ستُرجع "منذ 3 ساعات"، "بعد يومين") - تحليل اللغة الطبيعية:
Carbon::parse('next monday')
مثال على استخدام Carbon:
<?phpuse Carbon\\Carbon;
$now = Carbon::now('Europe/Moscow');echo $now->toDateString(); // 2025-03-15
$birthday = Carbon::create(1990, 5, 20);echo $birthday->age; // 34
// الفرق بين التواريخ$start = Carbon::parse('2024-01-01');$end = Carbon::parse('2024-12-31');echo $start->diffInDays($end); // 365
// تاريخ نسبيecho Carbon::parse('-1 week')->diffForHumans(); // "منذ أسبوع واحد"?>Chronos — بديل من CakePHP
Chronos هي مكتبة مستقلة أنشأها مطورو CakePHP. الفرق الرئيسي فيها هو عدم القابلية للتعديل افتراضيًا (مثل DateTimeImmutable). الميزات:
- جميع الكائنات غير قابلة للتعديل — أكثر أمانًا للبيئات متعددة الخيوط
- دعم المناطق الزمنية مع مراعاة التوقيت الصيفي
- طرق تقريب ملائمة:
->startOfDay()،->endOfMonth() - خفيف الوزن (بدون تبعيات)
مثال على العمل مع Chronos:
<?phpuse Cake\\Chronos\\Chronos;
$date = Chronos::now();echo $date->addDays(10)->format('d.m.Y'); // 25.03.2025
// الفرق مع تحديد الدقة$future = Chronos::create(2025, 12, 31);echo $date->diffInDays($future); // 291
// التحقق من التاريخecho $date->isWeekend() ? 'عطلة نهاية الأسبوع' : 'يوم عمل';?>CakePHP Time — للعمل مع المناطق الزمنية
أداة أخرى من CakePHP — Cake\\I18n\\Time. توسع Chronos وتضيف دعم التدويل. مفيدة عندما تحتاج إلى عرض التواريخ بلغات مختلفة:
<?phpuse Cake\\I18n\\Time;
Time::setDefaultLocale('ar_SA');$time = Time::parse('2025-03-15 14:30:00', 'Europe/Moscow');echo $time->i18nFormat('dd MMMM yyyy'); // 15 مارس 2025?>مقارنة المكتبات
لاختيار المكتبة المناسبة، انتبه إلى المعايير التالية:
- Carbon — أفضل خيار لمشاريع Laravel