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 (ראשון), וזה מספר התאים הריקים שבאים לפני ה-1 בחודש, ו-format('t') נותן את מספר הימים בחודש. ה-! ב-'!Y-m' מאפס כל שדה שהפורמט לא מזכיר, ולכן היום הוא ה-1 והשעה היא חצות.
טעויות נפוצות עם 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.