Menu

datetime ב-Python: תאריכים, שעות, timedelta ואזורי זמן

סיור מעשי במודול datetime של Python: פענוח, עיצוב, חישובים על תאריכים וטיפול באזורי זמן בלי ללכת לאיבוד.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

שני הטיפוסים המרכזיים: date ו-datetime

המודול datetime נותן ארבעה דברים שכדאי להכיר: date, time, datetime ו-timedelta. שלושת הראשונים הם בדיוק מה שהם נשמעים; הרביעי הוא פרק זמן.

date מייצג יום (שנה, חודש, יום) בלי שעון. datetime הוא תאריך ועוד שעה. אם לא צריך את השעה, date היא הבחירה המסודרת יותר.

יצירת תאריכים ספציפיים

בונים ישירות:

הארגומנטים הם year, month, day עבור date, ועד year, month, day, hour, minute, second, microsecond עבור datetime.

קריאת שדות

לכל date ו-datetime יש תכונות:

isoformat() היא החברה הכי טובה שלכם לפלט שמכונות קוראות: היא מייצרת משהו כמו "2026-04-20T09:30:15" שמערכות אחרות יכולות לפענח בלי עמימות.

עיצוב עם strftime

לפלט שבני אדם קוראים, .strftime(fmt) הופכת date או datetime למחרוזת מעוצבת:

קודי הפורמט שהכי כדאי לזכור:

  • %Y: שנה בארבע ספרות (2026)
  • %m: מספר החודש, עם אפס מוביל (04)
  • %d: היום בחודש, עם אפס מוביל (20)
  • %H / %I: שעה, בפורמט 24 או 12 שעות
  • %M: דקה
  • %S: שנייה
  • %A / %a: שם היום, מלא / מקוצר (Monday / Mon)
  • %B / %b: שם החודש, מלא / מקוצר (April / Apr)
  • %p: AM/PM

לא צריך לשנן אותם; שמרו טבלת עזר וחפשו בה כשצריך.

פענוח עם strptime

הכיוון ההפוך: לוקחים מחרוזת במבנה ידוע והופכים אותה ל-datetime:

מחרוזת הפורמט חייבת להתאים לקלט בדיוק. אם היא לא מתאימה, strptime זורקת ValueError.

למחרוזות ISO-8601 (התקן שמכונות קוראות) יש קיצור דרך פשוט יותר ב-Python מודרנית:

אם אתם מתמודדים עם פורמטים אקראיים, בחבילה החיצונית dateutil (pip install python-dateutil) יש parser.parse() סלחנית שמנחשת ניחוש סביר.

חישובים עם timedelta

כדי לחשב עם תאריכים, השתמשו ב-timedelta עבור ההפרש או ההיסט:

הארגומנטים של timedelta: days, seconds, microseconds, milliseconds, minutes, hours, weeks. אין months או years, כי אורך החודשים משתנה. לחישובים של חודשים ושנים, השתמשו ב-dateutil.relativedelta:

from dateutil.relativedelta import relativedelta
from datetime import date

today = date.today()
next_quarter = today + relativedelta(months=3)
print(next_quarter)

אזורי זמן: נאיבי מול מודע

datetime בלי מידע על אזור זמן הוא נאיבי (naive): Python לא יודעת איזה אזור זמן הוא מייצג. חישובי זמן על datetimes נאיביים הם בסדר כל עוד נשארים בתוך אזור זמן לוגי אחד; הצרות מתחילות ברגע שנתונים מאזורים שונים נפגשים.

datetime מודע (aware) נושא איתו את המידע על אזור הזמן. צרפו אזור זמן במפורש:

Python 3.9 הוסיפה את המודול zoneinfo לאזורי זמן לפי שם (בעזרת מסד הנתונים IANA של המערכת):

ממירים בין אזורים עם .astimezone():

כלל שכדאי לחרוט בזיכרון: שמרו datetimes ב-UTC, והמירו לאזורים מקומיים רק בזמן התצוגה. ההרגל האחד הזה מונע את רוב הבאגים של אזורי זמן.

חותמות זמן

חותמת זמן של Unix היא מספר השניות מאז 1970-01-01 UTC. Python ממירה בקלות:

חותמות זמן שימושיות להשוואות, למיון ולעבודה משותפת עם מערכות אחרות. לפלט שמיועד לבני אדם, המירו קודם חזרה ל-datetime.

מדידה של כמה זמן משהו לוקח

למדידות מהירות, מחסרים שני datetimes:

למדידת ביצועים רצינית יותר, השתמשו ב-time.perf_counter(): יש לה רזולוציה של פחות ממיקרו-שנייה והיא חסינה לשינויים בשעון המערכת. datetime.now() מתאימה למספרים בסגנון "כמה זמן לקחה הקריאה ל-API".

דפוסים שתשתמשו בהם שוב

מה לקחת מכאן

  • date, datetime ו-timedelta מכסים 90% מהצרכים.
  • השתמשו ב-ISO-8601 לפלט שמכונות קוראות, וב-strftime לפלט שבני אדם קוראים.
  • שמרו ב-UTC; המירו בזמן התצוגה.
  • השתמשו ב-zoneinfo לאזורי זמן לפי שם.
  • לחודשים ולשנים, השתמשו ב-dateutil.relativedelta.

עוד כלי אחד לארגז הכלים המעשי שלכם: ביטויים רגולריים, בהמשך.

שאלות נפוצות

איך מקבלים את התאריך והשעה הנוכחיים ב-Python?

datetime.now() מחזירה את התאריך והשעה המקומיים הנוכחיים. datetime.utcnow() מחזירה UTC (אבל כיום מעדיפים את datetime.now(timezone.utc), כי utcnow() מחזירה datetime נאיבי). לתאריך בלבד, השתמשו ב-date.today().

איך מעצבים תאריך כמחרוזת?

השתמשו ב-.strftime(format) עם קודי פורמט כמו %Y-%m-%d עבור שנה-חודש-יום. לדוגמה: datetime.now().strftime('%Y-%m-%d %H:%M'). כדי לפענח מחרוזת בחזרה, השתמשו ב-datetime.strptime(text, format) עם אותם קודי פורמט.

איך מוסיפים ימים לתאריך ב-Python?

השתמשו ב-timedelta: from datetime import date, timedelta; date.today() + timedelta(days=7). timedelta תומך בימים, שעות, דקות, שניות, שבועות ועוד. לחישובים של חודשים ושנים, השתמשו בחבילה החיצונית dateutil.relativedelta: timedelta לא מכיר חודשים.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל