
פרק קודם:
פייתון פרק 19 - תאוריה וזמןמה נלמד
- מודול datetime
- date object
- datetime object
- timezones object
- tzinfo object
מודול datetime
קיים בפייתון המודול time
.
אז למה לנו עוד מודול?
המודול datetime
היא הרחבה ואפשר לומר אפילו שיפור למודול time
.
המודול לוקח את תכונות הזמן ובונה מסביב גם מודל תאריך.
כפי שלמדנו כבר תאריך זה לא בהכרח חד משמעי, יש לנו מגוון קלנדרים ומגוון תרבויות לתמוך בהן,
למשל שנה מעוברת.
הלוח הפופולרי הוא כמובן הלוח הגרגוריאני ואלו התאריכים הבסיסיים שאנחנו משתמשים בהם.
מודע ונאיבי
המודול יוצר השוואה בין 2 סוגים של מבנים.
- זמן מודע
- זמן נאיבי
זמן מודע הוא מבנה שיש לו ידע על אזור הזמן והקלנדר שלו.
למשל:12:00 01/01/2025 +gmt 2
בפיסת המידע הזו יש 3 פרטי מידע:
- זמן
- תאריך
- אזור זמן
ותכלס מאזור הזמן אפשר גם להסיק את האזור הגאוגרפי.
זמן נאיבי הוא זמן שאיננו יודע מה אזור הזמן שלו והקלנדר שלו למשל:17:00
01/01/2025
מהי החשיבות של מודע ונאיבי?
אנחנו צריכים את המידע על אזור הזמן והקלנדר בשביל לענות על שאלות מורכבות יותר.
למשל שאלה פשוטה שהתשובה שלה בצורתה הכללית מאוד מורכת -
האם היום הוא יום עבודה?
ובכן - שאלה זו נשמעת פשוטה ביותר, מה הבעיה לענות על זה?
כדי לקבל תשובה סופית ומדוייקת עלינו לדעת:
- איזה יום היום
- לפי איזה קלנדר אנחנו מציגים את היום
- אילו ימים מוגדרים כימי עבודה לפי הקלנדר
- אילו ימים מוגדרים כימי עבודה על פי החוק המקומי
- האם היום יום שבתון?
- האם היום יום אבל?
- האם היום יום חג?
- האם היום חופש מאורגן של החברה?
הכרת המידע לעומק על קלנדרים זה לא רק עניין טכני אלה עניין תרבותי לחלוטין.
אם תרצו להשיק אתר לקהילה החרדית תצטרכו לתמוך בהצגת תאריך עברי.
או אם תרצו להשיק אתר ביפן, תצטרכו ללכת לפי הקלנדר היפני.
אובייקט time
יחידת הבסיס במודול, האובייקט מייצג רק את הזמן.
הוא מכיל תכונות כמו hour
, minute
וכדו’…
כמו באובייקט time.time
האובייקט datetime.time
מכיל tzinfo
.
ולכן הוא יכול להיות אובייקט מודע.
הבדל נוסף הוא שהאובייקט אינו בר שינוי.
ברגע שיצרנו אובייקט זמן לא ניתן לשנות אותו.
הרזולוציה של אובייקט time
הוא milliseconds
.
רזולוציה מגדירה את יחידת המידה הקטנה ביותר שניתן לחשב.
1 | import datetime |
בברירת מחדל כל הערכים אפסיים.
1 | print(t.hour) # 12 |
לא ניתן לשנות ערכים:
1 | 15 d.hour = |
ניתן לפרמט את האובייקט למחרוזת:
1 | d = datetime.time(12,0,15) # 12:00.15 |
ניתן לבדוק להשוות זמנים אך לא ניתן לחבר או לחסר ביניהם:
1 | d1 = datetime.time(12,0,15) # 12:00.15 |
Fold
מאפיין מיוחד - יכול להכיל 0 או 1 וזה אומר האם האובייקט זמן הזה הוא חזרה על אותו הזמן.
מתי חזרה חשובה לנו?
כשאנחנו מזיזים את השעון אחורה.
זו תכונה חשובה לאובייקט זמן מודע.
שאלה
מה יוחזר מתוצאת הבדיקה הזו?
datetime.time(1,15,0, fold=1) > datetime.time(1,15,0)
יוחזר False
כי פונקציית ההשוואה בין 2 אובייקטי Time
לא מתייחסת למאפיין fold
.
תרגילים
- כתבו פונקצייה שלא מקבלת פרמטרים ומחזירה בוליאני אם השעה היא שעת ארוחת צהריים.
זכרו שניתן להשתמש במודולtime.time
כדי לקבל את השעה הנוכחית. - כתבו פונקציה המקבלת אובייקט זמן כפרמטר ומחזירה את השעה שעה אחורה.
יש לשים לב שאם השעה היא 00:00 בלילה ומחזירים שעה אחורה אז זה יחזיר ל23:00.
תשובות
1 | import time |
פתרנו את הבעיה בלי להשתמש ב-datetime.time
כי time.time
עדיין שימושי עבור הפתרון.
נלמד עכשיו גם איך להשתמש ב-datetime
כדי לפתור כאלו תרגילים.
1 | from datetime import time |
אובייקט date
1 | import datetime |
האובייקט מייצג יום בודד בלוח שנה.
יש לו שנה, חודש ויום.
למחלקה יש מתודות שאפשר להשתמש בהן מחוץ לאובייקט, למשל המתודה today
נותנת לכם את התאריך של היום.
בתאריכים יש קונספט שנקרא ordinal
שהוא דומה לקונספט של epoch
.
לעומת epoch
שמתחיל ב-1970, האורדינל מתחיל מתחילת הספירה המודרנית.
ניתן לבנות אובייקט כזה גם מתאריך ספציפי:
1 | import datetime |
הרזולוציה הקטנה של אובייקט תאריך הוא יום.
זאת אומרת שאין יחידת מידה קטנה יותר מיום לאובייקט זה.
מאפיינים פופולריים של האובייקט:
date.today
מחזיר את היום.date.fromisoformat
- פורמט מאוד פופולרי, יותר אובייקט מהפורמט YYYY-MM-DD
.date.fromordinal
– ממיר מספר ימים מתחילת הספירה לתאריך.
1 |
|
ניתן לפרמט לבד גם בעזרת strftime
:
ידעתם? זה קיצור ל- string format time
.
כדי לשנות חזרה נוכל להשתמש ב- datetime.strptime(str, format)
.
למדנו כבר איך לפרמט אך שוב אחזור על טבלת המידע:
קוד פורמט | משמעות בעברית |
---|---|
%a |
שם יום השבוע המקוצר לפי הגדרות האזור |
%A |
שם יום השבוע המלא לפי הגדרות האזור |
%b |
שם החודש המקוצר לפי הגדרות האזור |
%B |
שם החודש המלא לפי הגדרות האזור |
%c |
תצוגת תאריך ושעה מלאה לפי הגדרות האזור |
%d |
יום בחודש כמספר עשרוני (01–31) |
%f |
מיקרו-שניות כמספר עשרוני (000000–999999) |
%H |
שעה בפורמט 24 שעות (00–23) |
%I |
שעה בפורמט 12 שעות (01–12) |
%j |
יום בשנה כמספר עשרוני (001–366) |
%m |
חודש כמספר עשרוני (01–12) |
%M |
דקות כמספר עשרוני (00–59) |
%p |
AM או PM לפי הגדרות האזור |
%S |
שניות כמספר עשרוני (00–61) |
%U |
מספר השבוע בשנה (יום ראשון כיום ראשון בשבוע) (00–53) |
%u |
יום בשבוע (יום שני = 1, יום ראשון = 7) |
%w |
יום בשבוע כמספר עשרוני (יום ראשון = 0, שבת = 6) |
%W |
מספר השבוע בשנה (יום שני כיום ראשון בשבוע) (00–53) |
%x |
תצוגת תאריך לפי הגדרות האזור |
%X |
תצוגת שעה לפי הגדרות האזור |
%y |
שנה בלי המאה (שתי ספרות) (00–99) |
%Y |
שנה עם המאה (ארבע ספרות) |
%z |
הפרש זמן מ-UTC בפורמט ±HHMM |
%Z |
שם אזור הזמן (ריק אם אין אזור זמן) |
%G |
שנה לפי תקן ISO 8601 (השבוע הראשון כולל את יום חמישי הראשון) |
%V |
מספר השבוע לפי תקן ISO 8601 (01–53), שבועות מתחילים ביום שני |
%% |
תו % ממש |
תרגילים
- קבלו יום בין 1 ל 366 והמירו אותו לתאריך והציגו את התאריך בפורמט
ISO
- שימו לב שהשנה צריכה להיות השנה הנוכחית. - קבלו מחרוזת בפורמט
ISO
וכתבו למשתמש אם התאריך שהוזן הוא היום האחרון בחודש.
1 | from datetime import date |
1 | from datetime import date, timedelta |
חישוב תאריכים - אובייקט timedelta
כמה ימים היינו בחופשה?
המפתח בוב החליט לא לפתוח לוח שנה פיזי ולחשב את זה בעזרת פייתון.
בוב פתח קובץ והתחיל לקדקד חישובים,
אבל אוי! בוב לא למד timedelta
, עזרו לבוב למצוא את התאריך הנכון:
מהו החישוב הנכון?
totalDays
אוtotalDays2
?
1 | import datetime |
הפתרון הנכון הוא totalDays
.
כמו חישוב מתמטי אנחנו צריכים לקחת את היחידה הגדולה יותר ולהחסיר ממנה את היחידה הקטנה יותר.
במקרה שלנו totalDays
יוצא 62
.
ו-totalDays2
יוצא -62
.
אם נרצה להתחכם נוכל לחשב את אותו הדבר עם abs
:
1 | totalDays = (endVacation - startVacation).days |
תוצאת הפעולה מחזירה אובייקט deltatime
המייצג את הדלתא כתוצאת חישוב.
תרגילים
- חשבו כמה ימים נשארו עד תחילת השנה החדשה הבאה.
כתבו קוד גנרי ואל תכתבו את השנה בצורהhardcoded
. - לסטודנטית יש דדליין עד לעבודת הגשה שלה.
היא ביקשה מאיתנו לכתוב תכנית שתכתוב את התאריך בימים וחודשים,
התכנית תחשב כמה ימים נשארו את התאריך שלה.
1 | from datetime import date |
1 | from datetime import date |
אובייקט datetime
כעת הכל מתכנס ליחידה אחת - גם תאריך וגם שעה.
1 | from datetime import datetime |
לאובייקט לא מתווספים פעולות מיוחדות, כל מה שלמדנו על time
ו-date
מתכנסים פשוט לאובייקט אחד.
גם הפורמט וגם החישובים.
חישוב שנים וחודשים
מאחר וחודש הוא לא משהו קבוע החישוב של ספריית פייתון היא נאיבית ופשוט תוסיף את הימים לפי מה שכתבתם.
מי שבנה את הספרייה ומי שבנה את datetime
החליט לא להתעסק יותר מדי והנקודה הזו לא מומשה כראוי.
נכון לפייתון 3.13 זה עדיין לא נפתר.
מה שאפשר לעשות זה להשתמש ב-python-dateutils
, ספרייה חיצונית.
אובייקטים tzinfo & timezone
datetime.tzinfo
הוא אובייקט בסיס, לא משתמשים בו ישירות.
זה הבסיס לתמיכה באזורי זמן שונים.
כפי שלמדנו במחלקות זהו אובייקט אבסטרקטי ולכן לא יוצרים אותו.
מה שאנחנו צריכים זה - datetime.timezone
.
זוהי המחלקה של פייתון שיורשת את tzinfo
.
האובייקט מקבל מספר שעות ודקות שאומר כמה הזמן שונה.
ניתן גם לייצג את הזמן בעזרת utc
עם timezone.utc
.
1 | from datetime import timezone, timedelta, datetime |
תרגילים
- לעובד שלנו בארה”ב יש פגישה עם אשת מכירות מסין.
כתבו תכנית התקבל כקלט עבור העובד בארה”ב ועבור העובדת מסין:- זמן מינימלי שאפשר להתחיל בו
- זמן מקסימלי שאפשר להתחיל בו
- אורך הפגישה - מקסימום שעתיים.
הפלט יהיה השעה בשני אזורי הזמן ואורך הפגישה.
ההבדל בין הזמנים הוא 13 שעות.
- רובי הדויד הוא רובוט קטן עם לב גדול.
הוא גר בישראל, ובדיוק שלח חבילה לחברתו טוקי שגרה בטוקיו .
החבילה נשלחה ביום 31 באוגוסט 2025 בשעה 14:00 לפי שעון ישראל (UTC+3).
זמן הטיסה של החבילה הוא 11 שעות ו־45 דקות בדיוק.
חשב את זמן ההגעה לטוקיו לפי שעון מקומי (UTC+9)
הדפס את שעת היציאה וההגעה של החבילה בפורמט יפה
לדוגמה: Departing at 2025-08-31 14:00+03:00 | Arriving at 2025-09-01 03:45+09:00
1 | from datetime import datetime, timedelta, timezone |
1 | from datetime import datetime, timedelta, timezone |
למדנו על זמנים, תאריכים ואזורי זמן.
ראינו כיצד חישוב זמן שנשמע לנו כמו דבר פשוט מכיל הרבה נקודות בעיתיות ומורכבות עמוקה.
תרגלנו אזורי זמן והתמודדות עם הדפסות.
טיפ:
רוב הזמן נרצה לשמור זמנים ב-
UTC
כי קל לנו להמיר את התאריך לאזורי זמן שונים.
בפרק הבא נעבור על למבדות, פרק קליל ונחמד על פיצ’ר מעולה עם תאוריה שתביא אתכם לרמת תוכנה יותר גבוהה!
פייתון 21 - למבדות