تعيد date('Y-m-d') تاريخ اليوم نصًا، مثل 2026-03-14. الوسيط الأول نص تنسيق يمثل فيه كل حرف جزءًا من التاريخ (Y السنة، وm الشهر، وd اليوم، وH:i:s الوقت)، والوسيط الثاني الاختياري طابع زمني Unix يُنسَّق بدل اللحظة الحالية.
تتغير المخرجات في كل مرة تضغط Run، لأنها التاريخ والوقت الحاليان بتوقيت UTC. وكل حرف في نص التنسيق، وطريقة وضع نص عادي بينها، موجودة في صفحة تنسيق التاريخ في PHP.
الطوابع الزمنية: time() وmktime() وstrtotime()
الطابع الزمني Unix هو عدد الثواني منذ 1 يناير 1970 عند منتصف الليل بتوقيت UTC. تعيد time() الطابع الحالي، وتبني mktime(hour, minute, second, month, day, year) طابعًا من أجزاء، وتقرأ strtotime() تاريخًا مكتوبًا بالإنجليزية ('2026-03-14' و'+1 week' و'next monday'). مرّر أي طابع زمني وسيطًا ثانيًا لـ date(). والوسيط الثاني لـ strtotime() هو اللحظة التي تُحسب منها العبارة النسبية؛ ودونه تُحسب من الآن.
المخرجات:
1773480600
Sat, 14 Mar 2026 09:30
2027-01-01
tomorrow Sun 2026-03-15
+1 week Sat 2026-03-21
next monday Mon 2026-03-16
last day of this month Tue 2026-03-31
first monday of next month Mon 2026-04-06
bool(false)
الالتفاف في mktime() مفيد: اليوم 0 من شهر هو آخر يوم من الشهر الذي قبله، لذا فإن mktime(0, 0, 0, 3, 0, 2026) هو 28 فبراير. وقارن النتيجة دائمًا بـ false قبل تمريرها: تطبع date('Y-m-d', false) بهدوء 1970-01-01، تاريخًا لم يقصده أحد.
إضافة أيام إلى تاريخ
لأي شيء يتجاوز الطباعة، استخدم DateTimeImmutable. يأخذ تابعه modify() العبارات نفسها التي تأخذها strtotime() ويعيد تاريخًا جديدًا، ويأخذ add() كائن DateInterval مثل P7D (مدة 7 أيام) أو PT90M (90 دقيقة).
المخرجات:
2026-03-21
2026-03-13
2026-04-14
11:00
2025-03-14
2026-03-03
2026-02-28
لا يوجد 31 فبراير، لذا يقع +1 month على 31 يناير في 3 مارس. وعندما تقصد «آخر الشهر القادم»، قل ذلك بـ last day of next month.
DateTime مقابل DateTimeImmutable
يغيّر DateTime نفسه عندما تستدعي modify() أو add() أو setDate()، ويعيد الكائن نفسه. وهذا يفاجئ من يحتفظون بالتاريخ الأصلي في متغير:
المخرجات:
2026-03-21
2026-03-21
bool(true)
2026-03-14
2026-03-21
فضّل DateTimeImmutable في الشيفرة الجديدة. للصنفين التوابع نفسها وكلاهما ينفّذ DateTimeInterface، لذا تستطيع الدالة قبول أي منهما.
الفرق بين تاريخين
تعيد diff() كائن DateInterval. خاصيته days هي العدد الكلي للأيام بين التاريخين، بينما تقسم y وm وd الفجوة إلى سنوات وأشهر وأيام، وهذا بالضبط ما يحتاجه حساب العمر. غيّر التواريخ وشغّله مرة أخرى:
المخرجات:
Age: 35
Exactly: 35 years, 7 months, 22 days
Days alive: 13021
286 days to go
9 months and 11 days
-286 days
في format()، %a هو العدد الكلي للأيام و%d هو جزء الأيام فقط، لذا فإن %a هو ما تستخدمه لـ «الأيام المتبقية». ولمقارنة تاريخين دون فرق، تعمل العوامل العادية على كائنات التواريخ: $today < $christmas تساوي true.
المناطق الزمنية
تستخدم date() وnew DateTimeImmutable() المنطقة الزمنية الافتراضية، التي تأتي من date.timezone في php.ini (UTC عندما لا تكون مضبوطة). اضبطها للسكربت كله بـ date_default_timezone_set()، أو أعطِ تاريخًا واحدًا DateTimeZone خاصًا به وحوّل بـ setTimezone():
المخرجات:
Asia/Tokyo 2026-03-14 18:30 JST +09:00
Europe/Berlin 2026-03-14 10:30 CET +01:00
America/New_York 2026-03-14 05:30 EDT -04:00
Asia/Tokyo
2026-03-14 18:30
الطابع الزمني هو العدد نفسه في كل مكان؛ ولا تغيّر المنطقة الزمنية إلا طريقة كتابته. لهذا تكون النصيحة المعتادة أن تخزّن التواريخ بتوقيت UTC وتحوّلها عند عرضها.
عرض تقويم على صفحة ويب
أكثر ما تُطبع التواريخ في HTML. ترسم هذه الكتلة الشهر الحالي تقويمًا وتبرز اليوم. شغّلها، ثم انقر Previous أو Next: يعمل السكربت نفسه مرة أخرى مع ضبط $_GET['m'] من الرابط، مثل ?m=2026-04.
تعطي format('N') يوم الأسبوع من 1 (الاثنين) إلى 7 (الأحد)، وهو عدد الخلايا الفارغة قبل اليوم الأول، وتعطي format('t') عدد أيام الشهر. وتعيد ! في '!Y-m' ضبط كل حقل لا يذكره التنسيق، فيكون اليوم هو الأول والوقت منتصف الليل.
أخطاء شائعة مع date()
يجب أن يكون الوسيط الثاني لـ date() طابعًا زمنيًا، لا نص تاريخ. هذا السطر:
<?php
echo date('d/m/Y', '2026-03-14');
يوقف السكربت بـ TypeError:
PHP Fatal error: Uncaught TypeError: date(): Argument #2 ($timestamp) must be of type ?int, string given in /home/index.php:2
حوّل النص أولًا، بـ strtotime() أو بكائن:
المخرجات:
14/03/2026
14/03/2026
bool(false)
bool(true)
وخطآن آخران يجب الانتباه إليهما: m هو الشهر وi هو الدقائق، لذا تطبع 'H:m' الشهر حيث أردت الدقائق؛ وترمي new DateTimeImmutable('garbage') استثناءً بدل إعادة false، لذا ضع مُدخلات المستخدم داخل try/catch أو حللها بـ DateTimeImmutable::createFromFormat()، التي تعيد false عند عدم التطابق.
الأسئلة الشائعة
كيف أحصل على التاريخ الحالي في PHP؟
استدعِ date() مع نص تنسيق: تطبع echo date('Y-m-d'); تاريخ اليوم مثل 2026-03-14، وتضيف date('Y-m-d H:i:s') الوقت. ونسخة الكائن هي (new DateTimeImmutable())->format('Y-m-d').
كيف أضيف أيامًا إلى تاريخ في PHP؟
استخدم modify() على DateTimeImmutable: تعطي (new DateTimeImmutable('2026-03-14'))->modify('+7 days')->format('Y-m-d') التاريخ 2026-03-21. ومع الطوابع الزمنية، تفعل date('Y-m-d', strtotime('+7 days', $timestamp)) الشيء نفسه.
كيف أحسب الفرق بين تاريخين في PHP؟
استدعِ diff() على أحد التاريخين مع الآخر: تعيد $a->diff($b) كائن DateInterval. خاصيته days هي العدد الكلي للأيام، وتحمل y وm وd السنوات والأشهر والأيام، وهكذا تحسب عمر شخص.
كيف أحوّل طابعًا زمنيًا Unix إلى تاريخ في PHP؟
مرّره وسيطًا ثانيًا لـ date(): تعيد date('Y-m-d H:i:s', 1773479107) القيمة 2026-03-14 09:05:07 بتوقيت UTC. ولكائن، استخدم new DateTimeImmutable('@1773479107').
لماذا تعرض date() في PHP وقتًا خاطئًا؟
تستخدم date() المنطقة الزمنية الافتراضية، التي تأتي من date.timezone في php.ini وكثيرًا ما تكون UTC. اضبط منطقتك بـ date_default_timezone_set('Europe/Berlin') في أعلى السكربت، أو مرّر DateTimeZone إلى DateTimeImmutable.